| 
                         实例代码 
- ExecutorService executor = Executors.newSingleThreadExecutor(); 
 -  for (int i = 0; i < 5; i++) { 
 -  executor.execute(() -> { 
 -  System.out.println(Thread.currentThread().getName()+"正在执行"); 
 -  }); 
 -  } 
 - 复制代码 
 
  
运行结果: 
 
使用场景 
适用于串行执行任务的场景,一个任务一个任务地执行。 
newScheduledThreadPool
-  public ScheduledThreadPoolExecutor(int corePoolSize) { 
 -  super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, 
 -  new DelayedWorkQueue()); 
 -  } 
 - 复制代码 
 
  
线程池特点 
    - 最大线程数为Integer.MAX_VALUE
 
    - 阻塞队列是DelayedWorkQueue
 
    - keepAliveTime为0
 
    - scheduleAtFixedRate() :按某种速率周期执行
 
    - scheduleWithFixedDelay():在某个延迟后执行
 
 
工作机制 
    - 添加一个任务
 
    - 线程池中的线程从 DelayQueue 中取任务
 
    - 线程从 DelayQueue 中获取 time 大于等于当前时间的task
 
    - 执行完后修改这个 task 的 time 为下次被执行的时间
 
    - 这个 task 放回DelayQueue队列中
 
 
实例代码 
-  /** 
 -  创建一个给定初始延迟的间隔性的任务,之后的下次执行时间是上一次任务从执行到结束所需要的时间+* 给定的间隔时间 
 -  */ 
 -  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
 -  scheduledExecutorService.scheduleWithFixedDelay(()->{ 
 -  System.out.println("current Time" + System.currentTimeMillis()); 
 -  System.out.println(Thread.currentThread().getName()+"正在执行"); 
 -  }, 1, 3, TimeUnit.SECONDS); 
 - 复制代码 
 
  
运行结果: 
 
- /** 
 -  创建一个给定初始延迟的间隔性的任务,之后的每次任务执行时间为 初始延迟 + N * delay(间隔)  
 -  */ 
 -  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 
 -  scheduledExecutorService.scheduleAtFixedRate(()->{ 
 -  System.out.println("current Time" + System.currentTimeMillis()); 
 -  System.out.println(Thread.currentThread().getName()+"正在执行"); 
 -  }, 1, 3, TimeUnit.SECONDS);; 
 - 复制代码 
 
  
使用场景 
周期性执行任务的场景,需要限制线程数量的场景 
回到面试题:说说几种常见的线程池及使用场景? 
回答这四种经典线程池 :newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool,newScheduledThreadPool,分线程池特点,工作机制,使用场景分开描述,再分析可能存在的问题,比如newFixedThreadPool内存飙升问题 即可 
线程池状态 
线程池有这几个状态:RUNNING,SHUTDOWN,STOP,TIDYING,TERMINATED。 
- //线程池状态 
 -  private static final int RUNNING = -1 << COUNT_BITS; 
 -  private static final int SHUTDOWN = 0 << COUNT_BITS; 
 -  private static final int STOP = 1 << COUNT_BITS; 
 -  private static final int TIDYING = 2 << COUNT_BITS; 
 -  private static final int TERMINATED = 3 << COUNT_BITS; 
 - 复制代码 
 
  
线程池各个状态切换图: 
 
                        (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |