线程池
程序员文章站
2022-05-04 17:16:19
...
池化技术:实现准备好资源,有人要用从我这里拿,用完了,还给我。
线程池的好处:
- 减少资源的消耗,因为要用线程池的资源必定都是一些创建销毁都是很耗资源的东西。
- 提高响应的速度
- 管边管理
线程池的三大方法,7大参数,4种拒绝策略
注意:根据阿里巴巴代码规范,线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样
的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
三大方法
# 创建一个容量的线程池
Executors.newSingleThreadExecutor();
# 创建固定容量的线程池
Executors.newFixedThreadPool(5);
# 创建弹性容量的线程池
Executors.newCachedThreadPool();
三大方法的底层还是调用ThreadPollExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
七大参数就是ThreadPoolExecutor的七个构造参数
int corePoolSize,// 核心个数
int maximumPoolSize,// 最大个数
long keepAliveTime, // 超时多少就被销毁
TimeUnit unit,// 超时的单位
BlockingQueue<Runnable> workQueue,// 阻塞队列
ThreadFactory threadFactory,// 线程工厂
RejectedExecutionHandler handler// 拒绝策略
四种拒绝策略
AbortPolicy:队列满了,不处理,会抛出异常
CallerRunsPolicy:队列满了,哪来的回哪去,main线程调用的那就main处理
DiscardPolicy:队列满了,丢掉任务,不会抛出异常
DiscardOldestPolicy:队列满你了,会尝试和最早的线程竞争,如果失败了,也会丢掉任务,不会抛出异常
CPU密集型和IO密集型
一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。
如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的。所以开多线程,比方说多线程网络传输,多线程往不同的目录写文件,等等。此时线程大于io数最好。