
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程池技术的应用是目前大多数Java编程开发程序员都需要熟练掌握的一个互联网编程技能,而本文我们就通过案例分析来了解一下,线程池技术应用基础知识分享。
1、为什么要使用线程池
在日常的开发过程中,经常要用到多线程,那么为什么不直接新建一个线程,而是选择使用线程池那,因为线程的创建要消耗系统资源,占用CPU的时间,所以考虑使用线程池;
2、阻塞队列
常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、priorityBlockingQueue
ArrayBlockingQueue底层使用数组+ReeTrantLock实现,既然是数组实现那么必然就要指定数组的长度
LinkedBlockingQueue使用单链表实现
SynchronousQueue要将任务放入SynchronousQueue中必须有一个线程在等待消费该任务,如果没有线程在等待,那么线程池中线程数小于大线程数就会创建一个线程,否则会执行拒绝策略
PriorityBlockingQueue具有优先级的阻塞队列
3、拒绝策略
ThreadPoolExecutor实现了4中拒绝策略,CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy
CallerRunsPolicy调用者来执行该任务;
AbortPolicy抛出异常,开发者可以捕获该异常,默认的策略;
DiscardPolicy直接丢弃,什么也不做;
DiscardOldestPolicy丢弃队列中老的任务,就是先入队的任务,也即将要被执行的任务;
4、java提供的线程池
Java的Exectors类提供了一些线程池的方法供开发者来用,但是好不用Java提供的,下面看有哪些以及为什么不建议使用
newFixedThreadPool()固定线程数的线程池,使用LinkedBlockingQueue,拒绝策略是默认的AbortPolicy;适用于为了满足资源管理的要求,而限制线程数量,适用于负载较重的机器
newSingleThreadExecutor()只有一个线程的线程池,使用LinkedBlockingQueue,拒绝策略是默认的AbortPolicy;适用于顺序执行各个任务的场景
newCachedThreadPool()按需创建新的线程池,核心线程数=0,阻塞队列为SynchronousQueue,拒绝策略是默认的AbortPolicy,线程池可以无限扩展,当任务多时创建许多线程,任务少时,自动清空线程;适应于执行短期异步任务,或者负载较轻的机器
newScheduledThreadPool()创建一个延时或定时的线程池,阻塞队列为DelayedWorkQueue
5、如何设置线程池中线程的数量
要想设置合理的线程数,需要区分任务是计算(CPU)密集型还是IO密集型
计算密集型针对计算密集型一般设置为CPU核数+1比较合理,因为是计算密集型,那么计算就要用CPU,设置为CPU的核数可以充分利用CPU的优势,至于为什么要加1,可以理解为计算密集型,也要有IO操作,加1是为了在等待IO的时候,充分利用CPU
IO密集型对应IO密集型,也就是说该任务涉及很多的IO操作,比如读写磁盘,远程RPC调用等,网上有很多数是设置为2*CPU核数+1,当然这也是可以的,不过下面这样设置可能更能发挥CPU的性能,CPU数*CPU利用率*(任务等待时间/任务计算时间+1)
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。