共计 1332 个字符,预计需要花费 4 分钟才能阅读完成。
线程池是一种池化思维的实现, 在咱们的应用中能够缩小一直创立和销毁线程而节约的工夫, 达到 线程复用 , 治理线程 , 管制最大并发 的作用.
启动线程池
java 在 executors 中提供了三种办法, 本质还是通过 ThreadPoolExecutor
ExecutorService pool1=Executors.newSingleThreadExecutor();// 一池一线程
ExecutorService pool2=Executors.newFixedThreadPool(n);// 指定大小
ExecutorService pool3=Executors.newCachedThreadPool();//Integer.MAX_VALUE
线程池参数
- corePoolSize:线程池外围线程数
- maxiumPoolSize:线程池最大线程数,必须大于等于 1。
- keepAliveTime:闲暇线程的存活工夫。
- unit:keepAliveTime 的单位
- workQueue:期待队列,被提交但未被执行的工作
- threadFactory:生成线程池中工作线程的线程工厂,用于创立线程,默认即可。
- handler:回绝策略,示意当队列满了并且工作线程大于等于最大线程数时,如何拒绝请求。
回绝策略
- 当达到最大线程数且期待队列满时,就要启用回绝策略。
- AbortPolicy(默认):间接抛出 RejectedException。
- CallerRunsPolicy:不会摈弃工作也不会抛出异样,而是回退给调用者。
- iscardOldestPolicy:抛弃期待最久的工作。
- DiscardPolicy:间接抛弃工作,不做任何解决。
线程池状态
当创立线程池后,初始时,线程池处于 RUNNING 状态;
如果调用了 shutdown()办法,则线程池处于 SHUTDOWN 状态,此时线程池不可能承受新的工作,它会期待所有工作执行结束;
如果调用了 shutdownNow()办法,则线程池处于 STOP 状态,此时线程池不能承受新的工作,并且会去尝试终止正在执行的工作;
当线程池处于 SHUTDOWN 或 STOP 状态,并且所有工作线程曾经销毁,工作缓存队列曾经清空或执行完结后,线程池被设置为 TERMINATED 状态。
工作原理
1. 线程池创立初始化后池中并没有线程.
2. 当调用 execute 办法增加一个申请工作时,线程池就会做以下判断
2.1 如果以后运行的线程数量少于 corePoolSize,那么马上创立线程运行这个工作
2.2 如果以后运行的线程数量大于等于 corePoolSize,那么将这个工作放进工作队列
2.3 如果当前任务队列曾经满了然而以后运行的线程数量少于 maxiumPoolSize,那么就要立刻创立非核心线程运行这个工作
2.4 如果当前任务队列满了并且正在运行的线程数量大于等于 maxiumPoolSize,那么线程池就会启动饱和回绝策略
3. 当一个线程实现工作后,它会从队列中取下一个工作来执行
4. 当一个线程无事可做超过肯定工夫(keepAliveTime),线程池就会判断:如果以后运行的线程数大于 corePoolSize,那么这个线程就会被停掉。所以线程池所有工作实现之后,最终会膨胀到 corePoolSize 的大小。