提供了创建各种线程池的工厂方法 和 内部类DefaultThreadFactory
image.png

newFixedThreadPool()

固定线程数
image.png

newSingleThreadExecutor()

希望多个任务排队执行,线程数固定为 1,任务数多于 1 时,会放入无界队列排队,任务执行完毕,这唯一的线程也不会被释放。区别于自己创建一个单线程串行执行任务,如果任务执行失败而终止那么没有任何补救措施,而线程池还会新建一个线程,保证池的正常工作
Executors.newSingleThreadExecutor() 线程个数始终为1,不能修改 ,Executors.newFixedThreadPool(1) 初始时为1,以后还可以修改,对外暴露的是 ThreadPoolExecutor对象,可以强转后调用 setCorePoolSize 等方法进行修改;
image.png :::tips

Executors.newSingleThreadExecutor()

线程个数始终为1,不能修改
FinalizableDelegatedExecutorService 应用的是装饰器模式,只对外暴露了 ExecutorService 接口,因此不能调用 ThreadPoolExecutor 中特有的方法 ::: :::tips

Executors.newFixedThreadPool(1)

初始时为1,以后还可以修改 对外暴露的是 ThreadPoolExecutor 对象,可以强转后调用 setCorePoolSize 等方法进行修改:::

newCachedThreadPool()

带缓冲的线程池,最大线程数为Integer的最大值,新的任务只能创建新的线程
这是一个可根据需要创建新线程的线程池,如果现有线程没有可用的,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源这种线程池比较灵活,对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能
image.png

SynchronousQueue同步队列

put方法会阻塞,直到有线程来取。适合短时间的任务。

newScheduledThreadPool() 任务调度

  1. //delay 真正的延迟执行 执行完再等待设置的时间
  2. private static void withFixedDelay() {
  3. scheduledExecutorService = Executors.newScheduledThreadPool(2);
  4. scheduledExecutorService.scheduleWithFixedDelay(()->{
  5. log.debug("start---task1");
  6. try {
  7. TimeUnit.SECONDS.sleep(2);
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. },2,1,TimeUnit.SECONDS);
  12. }
  13. //period 是包含在线程的执行时间当中的,如果执行完已经超过设置的时间,就马上执行下一次
  14. private static void atFixedRate() {
  15. scheduledExecutorService = Executors.newScheduledThreadPool(2);
  16. scheduledExecutorService.scheduleAtFixedRate(()->{
  17. log.debug("start---task1");
  18. try {
  19. TimeUnit.SECONDS.sleep(2);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. },2,1,TimeUnit.SECONDS);
  24. }

  1. public static void main(String[] args) throws InterruptedException, ExecutionException {
  2. ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor(1);
  3. /**
  4. * 1、当前在编码的时候距离周三还有多久------initialDelay
  5. * 当前时间 周三的时间
  6. * 2、下一次多久之后执行(周期时间)delay
  7. * 3、单位
  8. */
  9. //当前时间
  10. LocalDateTime currentTime = LocalDateTime.now();
  11. //本周周三晚上10点
  12. LocalDateTime targetTime = currentTime.withHour(22).withMinute(0).withSecond(0).withNano(0).with(DayOfWeek.WENDESDAY);
  13. if(targetTime.compareTo(currentTime)<0){
  14. targetTime = targetTime.plusWeeks(1);
  15. }
  16. long l = Duration.between(currentTime, targetTime).toMillis();
  17. long delay = 1000 * 60 *60 *24 *7;
  18. log.debug("当前时间:[{}]",l);
  19. log.debug("目标时间:[{}]",targetTime);
  20. scheduled.scheduleWithFixedDelay(()->{
  21. log.debug("redis---mysql async");
  22. },l,delay,TimeUnit.MILLISECONDS);
  23. }