所谓的线程池,就是多个线程封装到一起进行操作。对应的场景例如:针对某一项任务,需要多个线程同时操作。
线程池有三个情况:
- 工作很大,有多少人要多少人,一直到完成
- 工作很大,但是只能招聘10人
- 工作很大,但是只有一个人做
如何实现线程池呢?
实现线程池的核心接口定义在java.utils.*
这个包中。
- 普通的执行线程池:ExecutorService
- 调度线程池:ScheduledExecutorService(某些操作可以自动定时完成)
要进行线程池的创建,一般使用Executors的几个方法:
- Executors.newFixedThreadPool(3);
- Executors.newScheduledThreadPool(2);
- Executors.newSingleThreadExecutor();
- Executors.newSingleThreadScheduledExecutor();
- Executors.newCachedThreadPool();
线程池的底层实现代码
01、newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,
nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
02、newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1,
1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
03、newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
该方法返回一个可根据实际情况调整线程数量的线程池,该线程池内部在创建之初是没有任何线程的,当有任务到来时,首先查看线程池中是否存在空闲线程,如果没有空闲线程则创建之;反之则分配一个空闲线程来处理新到的任务;所有任务完成后,则将线程返还到线程中并重新设置为空闲状态,便于线程复用。
04、newSingleThreadScheduleExecutor
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
05、newScheduleThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
总结
- newFixedThreadPool创建一个可重用固定线程数目的线程池,以共享的无界队列方式来运行这些线程;该线程池在任意时刻都有固定数目的线程;如果线程不够使用,则会将新到的任务进行缓存排队。
- newSingleThreadExecutor创建一个单线程的线程池;这个线程池最多只有一个线程在处理任务,也就是相当于单线程串行执行所有任务;如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代他。该线程池可以保证所有的任务的执行顺序按照任务提交的顺序执行。
- newCachedThreadPool创建一个线程池大小可根据任务到来的情况进行自动伸缩的线程池,对于执行很多短期异步任务的程序而言,可以大大提升程序性能;该方法可以实现复用空闲线程;同时会自动移除60秒内未被使用的空闲线程,自动降低空间资源开销。
- newSingleThreadScheduleExecutor创建一个单线程的线程池;主要用于在给定的延迟之后运行任务,或定期执行任务;其功能与Timer类似。
- newScheduleThreadPool创建一个指定数量线程的线程池,其功能与4相同。