今天面了OPPO,小哥一上来就问:Java中有几种线程池?感觉自己有点忘了,遂复习一遍。
newSingleThreadExecutor
创建一个使用单个工作线程的执行器:保证所有的任务被顺序执行(FIFO),任何时候只有一个任务被执行。
1 | /** |
与newFixedThreadPool(1)不同,newSingleThreadExecutor方法返回的执行器不能被重新配置,即无法重新设置线程池的大小。原因在于FinalizableDelegatedExecutorService没有改变线程池大小的方法。
newFixedThreadPool
可重用固定线程数的线程池。创建一个线程池,池中的线程数量是固定的。当所有线程都处于活跃状态时(都在执行任务),如果此时又提交了一些任务,则将这些任务放入工作队列中,直到某个线程处于可用状态。
1 | /** |
在使用的过程中,可以使用ThreadPoolExecutor::setCorePoolSize
重新调整线程池的大小。
newCachedThreadPool
根据需要创建新线程的线程池。适用于执行许多短期的异步任务。
1 | /** |
newScheduledThreadPool
创建一个线程池,用于执行定时任务和周期性任务。
1 | /** |
ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类。
1 | // 调用了父类ThreadPoolExecutor的构造方法,使用延时队列 |