private static BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(10);
private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5,
5,
1,
TimeUnit.SECONDS,
queue,
new ThreadPoolExecutor.DiscardPolicy());
-
初始化线程池完整构造方法一共7个参数,分别为:核心线程数、最大线程数、非核线程空闲最大时间(就是非核心线程的空闲最大时间,超过这个时间依然没有任务的话,就销毁了)、空闲时间单位、队列、线程工厂、拒绝策略。
-
当执行
threadPool.execute(() -> {});
时。 -
核心线程有空闲:开始干活~
-
核心线程无空闲:你想累死你爹呀?去一边去,你去找队列排队去。
-
队列有空闲:进来排队把。
-
队列无空闲:我这满了,你去问问最大线程数去。
-
最大线程数有空闲:来我这把。
-
最大线程数无空闲:对不起,你是个好人。(拒绝策略,默认策略直接报异常)
顺序是:核心线程执行任务,核心线程用完了之后,任务会被放入队列,队列满了之后,会创建新的线程来执行任务,当总执行线程数等于设置的最大线程数时,并且队列也满了,此时在来新的任务时会被直接拒绝。当有核心线程空闲下来时,会去队列中拿一个最早的任务执行。当非核心线程执行完任务并且在设置的空闲时间内还没有接到新的任务时,会被销毁。队列里的任务只能由核心线程来执行。