提供了创建各种线程池的工厂方法 和 内部类DefaultThreadFactory
newFixedThreadPool()
固定线程数
newSingleThreadExecutor()
希望多个任务排队执行,线程数固定为 1,任务数多于 1 时,会放入无界队列排队,任务执行完毕,这唯一的线程也不会被释放。区别于自己创建一个单线程串行执行任务,如果任务执行失败而终止那么没有任何补救措施,而线程池还会新建一个线程,保证池的正常工作
Executors.newSingleThreadExecutor() 线程个数始终为1,不能修改 ,Executors.newFixedThreadPool(1) 初始时为1,以后还可以修改,对外暴露的是 ThreadPoolExecutor对象,可以强转后调用 setCorePoolSize 等方法进行修改;
:::tips
Executors.newSingleThreadExecutor()
线程个数始终为1,不能修改
FinalizableDelegatedExecutorService 应用的是装饰器模式,只对外暴露了 ExecutorService 接口,因此不能调用 ThreadPoolExecutor 中特有的方法
:::
:::tips
Executors.newFixedThreadPool(1)
初始时为1,以后还可以修改 对外暴露的是 ThreadPoolExecutor 对象,可以强转后调用 setCorePoolSize 等方法进行修改:::
newCachedThreadPool()
带缓冲的线程池,最大线程数为Integer的最大值,新的任务只能创建新的线程
这是一个可根据需要创建新线程的线程池,如果现有线程没有可用的,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源这种线程池比较灵活,对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能
SynchronousQueue同步队列
newScheduledThreadPool() 任务调度
//delay 真正的延迟执行 执行完再等待设置的时间private static void withFixedDelay() {scheduledExecutorService = Executors.newScheduledThreadPool(2);scheduledExecutorService.scheduleWithFixedDelay(()->{log.debug("start---task1");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}},2,1,TimeUnit.SECONDS);}//period 是包含在线程的执行时间当中的,如果执行完已经超过设置的时间,就马上执行下一次private static void atFixedRate() {scheduledExecutorService = Executors.newScheduledThreadPool(2);scheduledExecutorService.scheduleAtFixedRate(()->{log.debug("start---task1");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}},2,1,TimeUnit.SECONDS);}
public static void main(String[] args) throws InterruptedException, ExecutionException {ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(1);/*** 1、当前在编码的时候距离周三还有多久------initialDelay* 当前时间 周三的时间* 2、下一次多久之后执行(周期时间)delay* 3、单位*///当前时间LocalDateTime currentTime = LocalDateTime.now();//本周周三晚上10点LocalDateTime targetTime = currentTime.withHour(22).withMinute(0).withSecond(0).withNano(0).with(DayOfWeek.WENDESDAY);if(targetTime.compareTo(currentTime)<0){targetTime = targetTime.plusWeeks(1);}long l = Duration.between(currentTime, targetTime).toMillis();long delay = 1000 * 60 *60 *24 *7;log.debug("当前时间:[{}]",l);log.debug("目标时间:[{}]",targetTime);scheduled.scheduleWithFixedDelay(()->{log.debug("redis---mysql async");},l,delay,TimeUnit.MILLISECONDS);}
