zoukankan      html  css  js  c++  java
  • 线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?

        线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?

        1  一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。

         阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。

         阻塞队列自带阻塞和唤醒功能,不需要做额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活,不至于一直占用CPU资源。

        

        2 在创建新线程的时候,是要获取全局锁的,这个时候其他的就需要阻塞,影响了整体效率。

           就好比一个企业里面有十个(core)正式工的名额,最多招十个正式工(核心线程),要是任务超过正式人数(task>core)的情况下,工厂领导(线程池)不是首先扩招工人,还是这十个人,但是任务可以稍积压一下。即先放到

         队列中去(代价低)。十个正式工慢慢干,迟早会干完的,如果任务还在持续增加,超过正式工的加班忍耐极限了(队列满了),就招外包(非核心线程)帮忙了,还是正式工加外包还不能完成任务,那么新来的任务就会被领导拒绝(线程池拒绝策略)。

        线程池中线程复用的原理

        线程池将线程和任务进行解耦,线程是线程,任务时任务,摆脱了之前Thread创建线程时一个线程必须对应一个任务的限制。

        在线程池中,同一个线程可以从阻塞队列中不断的获取新任务执行,其核心原理在于线程池对Thread进行了封装,并不是每一次调用线程都会调用Thread.start()来创建新线程,而是让每个线程去执行循环任务,在这个循环任务中不停检查是否有任务需要被执行,

        如果有,直接执行,也就是调用任务中的run方法,将run方法当成一个普通方法执行,通过这种方式只使固定的线程就将所有任务run方法串联起来了。

        

  • 相关阅读:
    关于桌面的图片打开很慢的解决方法
    用c#进行递归组合
    ajax,js,css 入门页面
    择日宣判此案,却常再无下文
    共享软件的明确定义
    [转]大逃亡,还没出来呢
    如何收集带有附件的网页
    送一份自家产的软件给园内的兄弟姐妹作“福利”
    [转]评蒙牛内幕
    蓝侠==la*uan,破解中国共享软件联盟著名灌水专家“蓝侠””
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/14650408.html
Copyright © 2011-2022 走看看