幸福一箩筐|Java并发编程 | Executor线程池框架( 二 )

  • 线程池中线程数达到corePoolSize时 , 新任务将被放入workQueue中 , 等待线程池中任务调度执行;
  • 当workQueue已满 , 且maximumPoolSize>corePoolSize时 , 新任务会创建新线程执行任务;
  • 当workQueue已满 , 且提交任务数超过maximumPoolSize , 任务由RejectedExecutionHandler处理;
  • 当线程池中线程数超过corePoolSize , 且超过这部分的空闲时间达到keepAliveTime时 , 回收该线程;
  • 如果设置allowCoreThreadTimeOut(true)时 , 线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收;
  • 三、线程池应用应用场景:批量账户和密码的校验任务 , 在实际的业务中算比较常见的 , 通过初始化线程池 , 把任务提交执行 , 最后拿到处理结果 , 这就是线程池使用的核心思想:节省资源提升效率 。
    public class Executor02 {public static void main(String[] args) {// 初始化校验任务List checkTaskList = new ArrayList<>() ;initList(checkTaskList);// 定义线程池ExecutorService executorService ;if (checkTaskList.size() < 10){executorService = Executors.newFixedThreadPool(checkTaskList.size());}else{executorService = Executors.newFixedThreadPool(10);}// 批量处理List results = new ArrayList<>() ;try {results = executorService.invokeAll(checkTaskList);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 查看结果for (Future result : results){try {System.out.println(result.get());// System.out.println(result.get(10000,TimeUnit.SECONDS));} catch (Exception e) {e.printStackTrace() ;}}// 关闭线程池executorService.shutdownNow();}private static void initList (List checkTaskList){checkTaskList.add(new CheckTask("root","123")) ;checkTaskList.add(new CheckTask("root1","1234")) ;checkTaskList.add(new CheckTask("root2","1235")) ;}}// 校验任务class CheckTask implements Callable {private String userName ;private String passWord ;public CheckTask(String userName, String passWord) {this.userName = userName;this.passWord = passWord;}@Overridepublic Boolean call() throws Exception {// 校验账户+密码if (userName.equals("root")}return Boolean.FALSE ;}}线程池主要用来解决线程生命周期开销问题和资源不足问题 , 通过线程池对多个任务线程重复使用 , 线程创建也被分摊到多个任务上 , 多数任务提交就有空闲的线程可以使用 , 所以消除线程频繁创建带来的开销 。
    推荐阅读:GitHub源码和分类管理 , 持续更新
    Java并发编程 | 线程间通信 , 等待/通知机制
    Java并发编程 | 悲观锁和乐观锁机制
    【幸福一箩筐|Java并发编程 | Executor线程池框架】 Java并发编程 | 多线程并发访问 , 同步控制
    Java并发编程 | Fork/Join框架机制详解
    Java并发编程 | 线程核心机制 , 基础概念扩展
    Java并发编程 | Lock机制下API用法详解