Java线程池简单解释

96 阅读1分钟

线程池流程图

image.png

代码

public class ExectorTest {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor
                (2,4,3, TimeUnit.SECONDS,
                        new LinkedBlockingDeque<>(3),new ThreadPoolExecutor.DiscardPolicy());
        for (int i = 1; i <20; i++) {
            String data = "task@" + i;
            System.out.println(data);
            //提交任务
            threadPoolExecutor.execute(new ThreadPoolRunnable(data));
        }
        System.out.println("start test ---------------");
    }

    static class ThreadPoolRunnable implements Runnable{
        private Object taskData;

        public ThreadPoolRunnable(Object taskData) {
            this.taskData = taskData;
        }

        @Override
        public void run() {
            System.out.println("run - runnableData: " + taskData + " | " + Thread.currentThread());
            try {
                Thread.sleep(1000*5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            taskData = null;
        }
    }

参数含义

image.png

  • corePoolSize 核心数
  • maximumPoolSize 最大的数
  • keepAliveTime 就是 当线程数大于核心线程数时,在终止前,多余的空闲线程等待新任务的最长时间。
  • BlockingQueue<Runnable> workQueue 等待队列
  • RejectedExecutionHandler 拒绝策略
    • CallerRunsPolicy:线程池让调用者去执行。
    • AbortPolicy:如果线程池拒绝了任务,直接报错。
    • DiscardPolicy:如果线程池拒绝了任务,直接丢弃。
    • DiscardOldestPolicy:如果线程池拒绝了任务,直接将线程池中最旧的,未运行的任务丢弃,将新任务入队。

举例

  • 如果创建 1~20个线程,拒绝策略是DiscardPolicy,
    • 那么线程放入的顺序则是core12link345max67
  • 因为max虽然是4,但是包括了core的2.所以,max中还剩下2个名额。
    • 取出则是先从core max后link。那么可能是1267345