Executors是java 中用来创建和管理线程池的类以下是它的常用方法:
1.newFixedThreadPool(int nThreads):创建一个固定大小的线程池;
2.newCachedThreadPool():创建一个可缓存的线程池,根据需要创建新线程;适用于需要处理大量短期任务的场景,并且任务之间的执行时间比较短。线程池会根据需要创建新线程,如果线程空闲时间超过指定时间(默认为60秒),则会被回收。
3.newSingleThreadExecutor():创建一个单线程的线程池,保证任务的执行顺;适用于需要保证任务按顺序执行的场景,例如需要按照提交顺序处理任务的日志处理。
4.newScheduledThreadPool(int corePoolSize):创建一个固定大小的线程池,支持定时及周期性的任务执行;适用于需要定时以及周期性执行任务的场景。例如,定时任务调度、定期数据备份等。
5.newWorkStealingPool():创建一个工作窃取线程池,每次任务都被分配给一个工作线程,如果该线程完成自己的任务,它会从其他线程窃取任务执行;适用于需要高效处理大量独立任务的场景,并且任务之间没有依赖关系。这种线程池通过工作窃取算法,可以充分利用系统资源,提高任务处理的并行性。
这些方法返回一个 ExecutorService
对象,它是一个线程池的高级接口,提供了更多的功能和控制。
以上主要重点说的就是newScheduledThreadPool,其中有
-
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
:延迟指定时间后开始执行任务,并以固定的频率重复执行。 -
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
:延迟指定时间后开始执行任务,并以固定的延迟时间重复执行。 -
这两个的区别就在于scheduleAtFixedRate:是以period为间隔来执行任务的,如果任务执行时间小于period,则上次任务执行完成后会间隔period后再去执行下一次任务;但如果任务执行时间大于period,则上次任务执行完毕后会不间隔的立即开始下次任务
而scheduleWithFixedDelay 是不管任务执行多久,都会等上一次任务执行完毕后再延迟delay后去执行下次任务