亲爱的读者和朋友,我正在创作一篇文章。如果您认为内容很好,请喜欢并支持它。
在上一篇文章中,我们回顾了线程生命周期和线程的知识。在本文中,我们继续挖掘以增强对线程的理解。
作者注:本文是根据您有限的知识来组织的。如果有谬论,请读者在评论区域指出
了解该系列和一般轮廓:Java多线程系列
重要声明:
出于促进或帮助读者了解本文内容内容的读者的目的,文章中给出了一些示例,但是这些示例不能与Java中的概念100%准确,甚至是一个概念小天真。
读者和朋友应该注意这一点,并清楚地意识到他们的目标是了解Java中的概念和设计,而不是纠缠是否存在偏见。
此博客的内容相对分散。以下是内容的轮廓。您可以选择感兴趣的内容片段来读取和重新说明知识。
在上一篇文章中,我们提到,可以激活该线程而无需挖掘启动线程的特定过程。
它可能会让您失望,此细节不会被轻描淡写,因为设计和编写高质量的多线程应用程序无济于事。
如果您对此感兴趣,以下文章可能会有所帮助:
首先回到概念:
操作系统中的线程:是操作系统执行计算计划的最小单元。
JVM中的线程:线程是程序中的执行线程。Java虚拟机允许应用程序
“在编写应用程序时,您不会启动线程以显示启动线程的知识。”也就是说,该线程是一种手段,不难理解。应用程序的目的是完成已建立的任务,以及基于多线程并发容量或线程的程序的操作效率,或者是线程 -基于线条义务的边界的特征定义以有序的方式运行该程序。
例如,工厂收到一批订单,需要选择一批生产以完成具有相同能力的工人的订单。不难理解:工厂所有者关心订单的完成,而不是名称,星座,爱好
那么如何定义线程需要完成的任务?
在最初的JDK中,有两种方法:
随着JDK的发展,还有更多的方法来定义任务,我们将从随后的一系列文章开始。
此时,您应该表达JDK Doc所说的话
回到上一篇文章以获取示例。经过长时间的运营,工厂积累了足够的经验。老板突然意识到:只要工人能够胜任,就无需了解工人,只有:
不用担心张桑还是李·赛做了。
工人就像线程一样,生产线就像是线程池。com.combenting with工厂的实际情况和任务,可以凝结几种生产线管理方法。
在Java中,直接或间接依靠配置来获得线程池。
作者出版社:通过简单的搜索,您可以发现线程池中的大量博客可能受到面部的影响。一些博客是围绕几个共同的地面测试问题进行的。但是请注意,线程池的知识内容远远超过面试问题的内容!相反,了解线程池的设计更为重要。
而且我的文字技能是有限的,不可能像教科书一样遵循严格的轮廓。这也使文本深刻而有趣。我只能猜测读者的兴趣。
接下来,让我们结合生活经验,以工厂生产线为例,反思线程池的设计,并了解最基本的知识。
在上面,我们使用生产线将线程池与“工厂的工人管理方法”进行比较。
在线程池中,可以将工作工作的线程类似于工人,以完成生产线收到的任务。
请注意,这种类型的比率不是完全准确的
并不难以猜测线程池的两个核心内容:
任务队列用于存储任务。您应该注意到它在JUC下使用界面。它的本质仍然是队列,有两个特殊操作:
由于它是一个接口,因此自然可以具有不同的实现。您可以将不同的实现用作线程池的任务队列。
在线程池的设计中,您可以通过依赖抽象来理解访问访问的时机,即阻止等级。您可以自己决定队列的特征,例如大小,存储方法,优先排序,ETC。
它没有参与以前的一系列文章。它计划在随后的一系列文章中进行扩展,因此本文不会围绕它进行扩展
接下来,让我们看一下一个人作为生产线工作者的工作的整个过程,即成为线程池的过程
线程池中工人的生产线确定了一个位置。经理将邮政信息提供给人力资源部,并申请人力:
人力资源部向生产线派出了一小部分。Small T已经接受了技能培训,并且知道工作开始工作后,就足以从生产线完成并完成实力以完成它。
小t变成了一个。
您可能会意识到,线程池仅关心线程的管理,并且不在乎线程创建的细节,因此再次依靠抽象并了解线程创建的细节:
关于工人的定义和职责,您可以一般阅读以下源代码:
您可能会注意到,近年来某些社会坏事中总会有一个词:当然,我没有任何意愿在这里讨论社会问题。生产线具有固定的位置,并且将有临时工按需生产,甚至临时工人。这不难理解。线程池也具有这样的设计。
请注意,当管理螺纹池时,它等于线程。只有基于线程的特征,只有核心线的数量和最大线程数不会被视为核心/非核心。
如何确定帖子中的帖子,我们提到,生产线确定职位后,将其要求向人力资源部门,并安排成为生产线工作人员。
那么生产线如何确定位置?也就是说,线程池如何确定您需要添加一个工人?
生产线将不会无缘无故地安排工人工作,并且不可避免地会收到生产任务,否则它将成为合理的鱼类。
顺便说一句,当线程池接收任务时,当未达到相应的大小限制时,优先考虑安排线程进行处理而不是将其扔到任务队列和等待。
在上一系列文章中,我们了解到启动线程更昂贵。尽管计划了线程池,但一开始就不会在工作。
试图安排线程时
整个过程中都有CAS操作。鉴于一系列文章的写作计划,文章不再扩展。相应的代码可以指GIST:
参考要旨
迟到了生产线的任务(线程池),市场部门王王(Xiao Wang)获得了一份清单,来到生产线寻找负责人老挝的人,并让老挝安排杀死
线程池中的过程与此非常相似,并且代码相对较短:
当您拒绝任务时,尽管移民和老板希望在及时可靠的任务中完成任务,但在某些情况下,始终存在不满意的,但线程池将不得不拒绝任务。
上面已经提到:线程池已关闭,任务队列已满。
当线程池拒绝任务时,总是有一个俗话说JDK设计界面:
当实例化线程池时,有必要指示拒绝策略。
JDK提供了4种策略:
回头看,回头看构造函数ThreadPoolExecutor提供了一系列重型构造函数,以获得特定的实例
举个例子
当然,这些参数有一些限制和验证。您可以参考要点以进一步阅读并从JDK1.8中挑选它们。
线程池关闭的正面已提及线程池-CTL设计的状态徽标。线程池有5个状态。首先查看代码:已经确定了相应的二进制补语代码
请注意,在计算机中,数字由数字表示。如果有许多符号,则最高的位表示符号,1是负,0是非负的,非阴性数字与其原始代码和补充代码一致。另一个位置被逆转,然后添加1个以获取补充代码
显然,32 -bit INT分为不同的区域识别信息。在多线程背景下,使用了原子素,但本质仍然是int。
32位的三个高点用于存储状态信息,以及29位存储工作人员计数(即WC)。该信息存储在CTL中,这是非常传统的。
考虑到长度和阅读经验,其他相关的数字操作API已被剥离为要点,以及通过位操作等。
生命周期变化如下:
目前,请考虑一下,创建线程池机制的目的是什么?
如前所述,线程池由线程管理,显然不是根本原因。
您必须阅读一些面孔 - 表面经文,包括线程池的主题。这样,也许是面试陷阱
作者的媒体,不要简单地放弃面试的原始意图并放弃学习的原始意图。明确地说,线程池的设计比简单,无聊的抒情性更有意义通过在执行者中调用API获得的线程池
在JDK1.5中,Java凝结4配置方法以获取特定管理方法的线程池:
Java以其特征命名为执行者的方法,并将其借用为这4个线程池的别名
如前所述,他们直接或间接使用ThreadPoolExecutor而不是4个继承类!它们以API名称命名,但没有命名!
pixpthreadPoljDK中提供的包装方法如下:
显然,它是一个固定的池,即核心线的数量和最大线程数。注意值必须大于0。
这条生产线上的工人很痛苦。他们不会派人工作太多。任务在排队等候等待线程为空;如果他们不上班,则必须在帖子中对其进行处理,并且不会释放线程。
作为任务队列,首先要首先处理该任务,并且没有结合。
名称所建议的SinglethreadExecutor,我们将获得一个线程池。
也许你会想知道的,
具有核心线程和最大线程数量的线程池。为什么要增加参与?
没有前面提到,但是您可能知道可以再次配置ThreadPoolExecutor!例如,设置核心线程的数量:
继承了自我启示,并在时间时扩展了关闭线池。后者是包装器,仅揭示接口函数。重新配置线程池的能力通过调试结束。
cachedthreadpool此池将使用“线程对象”缓存方案,核心线程的数量为0,所有临时工人,并基于上述知识:
SendiuledThreadPool
与前三个不同,此时获得的线程池可以定期处理任务。
为了实现此目标
作者出版社:JDK中的源代码非常令人兴奋,值得阅读。
我相信您对线程池的设计有一定的了解。在JDK1.8之后,将未来的内容添加到线程池中。本文将不再继续扩展。执行者中API的源代码应具有已获得的线程池的特征。
在这一点上,内容非常漫长,但必须结束。该文章的内容(例如Future,atomicinteger,cas等)计划在本系列的其他文章中扩展,并且在文章中也避免了它们。延迟水和线池的具体细节以及线程池的调整需要代码和场景特定分析的组合。本文的主题无法享受。必须有更大的收益。
原始:https://juejin.cn/post/7098235227490746375