线程池终探

作者: 小鱼嘻嘻 | 来源:发表于2018-01-20 19:13 被阅读8次
线程池四种拒绝策略
  • AbortPolicy 直接抛异常
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            throw new RejectedExecutionException("Task " + r.toString() +
                                                 " rejected from " +
                                                 e.toString());
        }
  • DiscardPolicy 丢弃不处理
 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
  }
  • DiscardOldestPolicy 放弃最老的任务,加入当前任务
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
            }
        }
  • CallerRunsPolicy 执行当前任务
 public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            if (!e.isShutdown()) {
                r.run();
            }
        }
线程池实例
package xiezhewan;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by yuxi on 2018/1/24.
 */
public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 线程池核心线程数为1  延时为0 队列为有界队列长度为1, 拒绝策略为直接抛异常
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1,
                0, TimeUnit.MICROSECONDS,
                new ArrayBlockingQueue(1), new ThreadPoolExecutor.AbortPolicy());
        try {
            for (int i = 0; i < 10; i++) {
                threadPoolExecutor.submit(() -> {
                    try {
                        System.out.println("hello");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });

            }
        } catch (Exception e) {
            e.printStackTrace();
            threadPoolExecutor.shutdown();
        }
    }
}

可以看到结果为:

hello
java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@31221be2 rejected from java.util.concurrent.ThreadPoolExecutor@377dca04[Running, pool size = 1, active threads = 1, queued tasks = 1, completed tasks = 0]
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
    at xiezhewan.ThreadPoolDemo.main(ThreadPoolDemo.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
hello

相关文章

  • 线程池终探

    线程池四种拒绝策略 AbortPolicy 直接抛异常 DiscardPolicy 丢弃不处理 DiscardO...

  • 线程池再探

    线程池源码之execute execute: 总体来说就是: 如果线程的数量小于线程池的核心线程数直接创建线程执行...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • android 多线程 —上下文切换

    java 中的多线程在代码层面是通过 new 多个 Thread 或是线程池实现的,这只是表象,我们需要继续审图探...

  • 线程池-再探执行策略

    经过之前对线程池设计以及参数的进一步认知,再回过头来总宏观上复习一下线程池的执行策略。 有任务提交了,优先把核心线...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

  • 线程池

    1.线程池简介 1.1 线程池的概念 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性...

  • 多线程juc线程池

    java_basic juc线程池 创建线程池 handler是线程池拒绝策略 排队策略 线程池状态 RUNNIN...

网友评论

    本文标题:线程池终探

    本文链接:https://www.haomeiwen.com/subject/lgvtaxtx.html