Java线程池运行分析
1 | ExecutorService executorService = Executors.newCachedThreadPool(); |
创建一个线程池,它的构造函数有四个非常重要的参数
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime 线程空闲时间
BlockingQueue workQueue 阻塞队列
就那我上面创建的那个线程池来说,当有10个以内的任务需要执行时,会在线程池中创建相应的线程执行,当任务数大于10的时候,任务就会进入阻塞队列中,等待空闲的任务执行,当任务数大于20的时候,阻塞队列装不下了,也没有空闲的线程,但是这个时候的线程数是小于最大线程数20的,所以这个时候还会创建线程来执行20后面的任务(不会先执行阻塞队列的任务哦),如果这个时候任务数大于30且线程数已经最大,阻塞队列页塞不下,那么就会抛出RejectedExecutionException异常。这个时候如果有线程空闲就会去执行阻塞队列中的任务,当线程没有任务可以执行并且超过线程空闲时间,那么线程就会被销毁。
线程池中创建的线程通过代理的方式执行原来的任务