Java线程池的工作原理

线程的创建和销毁都是很耗费时间的,如果小任务比较多(比如频繁的接入接出),每一个任务都创建一个线程的话,我们把执行该任务分为三个片段,T 运行的整个时间,T1线程创建的时间,T2 线程等待以及任务处理的时间,T3 线程销毁的时间

 T=T1+T2+T3

如果任务很小,那么T1+T3 时间可能比T2的时间大很多,因此引入了线程池的概念,即每次在服务器里用一定数量的线程处理这些小任务,这样避免了线程的重复创建销毁,而把重心放在处理任务上。那么Java是怎么设计线程池的呢?

首先,需要有个BlockingQueue,负责存放小的任务,该BlockingQueue拥有生产者消费者容器的作用;

线程池有几个关键的参数,核心线程数、最大线程数,当线程池的线程数没有达到核心线程数时,新增一个任务就会创建一个线程,直到线程数达到核心线程数;当线程数达到核心线程数,如果此时任务队列里面的任务数目大于核心线程数,那么会创建新的线程直到最大线程数。

ThreadPool里面的start线程的方法是execute(任务)方法,该任务根据上面提到的线程池线程的数量采用不同的处理方式,当线程池的线程数量达到最大,任务提交后会放在Blockingqueue里面,根据生产者消费者模型,几个线程争抢Blockingqueue里面的任务,BlocingQueue有自动的类似wait、notify的机制,保证当线程池没有任务时候,所有的线程都处于wait()状态,当有任务的时候,会唤醒线程池里面的线程处理这些任务。

以上就是线程池的原理,参照源码理解的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值