Java 线程池

用户头像
陈皮
关注
发布于: 2020 年 07 月 27 日



什么是线程池(Thread Pool)



一种线程使用模式,解决线程频繁开启、关闭带来的性能开销问题。



Java 提供 4 种线程池

1. FixedThreadPool

固定的线程数据,保持长活,阻塞任务。





...

ExecutorService service = Executors.newFixedThreadPool(10);

...


2. CachedThreadPool

同步队列一次处理一个任务,线程池中的线程存活 60s,无线程可用时创建新的线程。





...

ExecutorService service = Executors.newCachedThreadPool();

...


3. ScheduledThreadPool

任务提交到延迟队列,定时消费任务。如果需要会创建更多的线程。





...
ExecutorService service = Executors.newScheduledThreadPool();
// task to run after 10 second delay
service.schedule(() -> {}, 10, TimeUnit.SECONDS);
// task to run repeatedly every 10 seconds
service.scheduledAtFixedRate(() -> {}, 15, 10 TimeUnit.SECONDS);
// task to run repeatedly 10 seconds after previous task completes
service.scheduledWithFixedDelay(() -> {}, 15, 10 TimeUnit.SECONDS)
...

4. SingleThreadedExecutor

只创建一个线程,任务阻塞,如果线程因为任务而关闭,重新创建线程。



...

ExecutorService service = Executors.newSingleThreadExecutor();

...


5. ThreadPoolExecutor

newFixedThreadPool 实现



public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}


ThreadPoolExcetuor 函数



public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
...
}












以下两种情况会进入 reject 回调



  1. 阻塞队列满了并且,线程都在执行。

  2. 线程池已关闭





线程被无法提交后有四个处理策略





6. shutdown

调用 shutdown() 之后,线程池会在已提交线程执行完后关闭。



awaitTermination(long timeout, TimeUnit unit), 判断线程池在线程执行完或指定时间内是否关闭。



Callable/Future









Reference

Java ExecutorService



发布于: 2020 年 07 月 27 日 阅读数: 32
用户头像

陈皮

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
请加“极客大学架构师训练营”标签,便于分类
2020 年 07 月 27 日 16:57
回复
没有更多了
Java 线程池