在 Java 并发中,是什么让线程“活跃”?只是它没有闲置的事实?从技术上讲,“等待”或“暂停”线程是否仍然处于活动状态?
5 回答
据我所知,“活跃”一词似乎被大量使用,但从未定义过。该ThreadGroup.enumerate()
方法记录在案:
将此线程组及其子组中的每个活动线程复制到指定的数组中。
从查看源代码来看,它正在检查Thread.isAlive()
方法并将其添加到可枚举中。由此我推断“活跃”和“活着”这两个术语是可以互换的,“活着”被定义为:
如果线程已启动且尚未死亡,则该线程处于活动状态。
看看 java.lang.Thread.State
在其他非 Java 系统中,active 等同于“RUNNABLE”。如果任务/进程/线程能够主动运行代码,则它是活动的。如果不是(阻塞等)则将其挂起
正如 Stephen C 所说,active 在这里更多地被用作英语而不是 Java。
在这种情况下,我认为“活跃”是指他们正在执行代码。非活动线程——那些在 I/O 调用或等待锁时被阻塞的线程——仅消耗内存资源而不影响 CPU(或仅略微影响)。
但是,这实际上取决于您的线程在做什么。如果每个线程都在迭代数字以计算素数,那么它们完全受 CPU 限制,您实际上应该每个内核只有一个以最大化吞吐量。如果他们正在发出 HTTP 请求或执行文件 I/O,那么您可以负担每个核心有很多。
最后,笼统地涵盖所有线程而不考虑它们在做什么是毫无价值的。
我强烈推荐Java Concurrency in Practice一书,它可以高质量地处理并发 Java 编程的主题。
“active”这个词在这里被用在正常的英语意义上。
active这个词的正常英文意思是“做某事”。所以线程“活动”的一个直观含义是它们实际上正在执行或准备执行。
在此引用的上下文中:
“每个内核有 4 - 20 个活动线程通常是可以接受的”
“活跃”一词与此一致,尽管我会对数字提出质疑。(20 太高了,IMO)。
但是,我认为这是一个故意含糊不清的陈述。赠品是使用黄鼠狼短语“它被普遍接受”(而不是引用任何特定来源)和广泛的范围(“4 - 20”)。因此,您可以认为“主动”一词是故意含糊不清的另一个例子。
IMO,引用的作者试图提出“线程太多是不好的”的一般观点......而不是精确地说明“太多”是什么。通过捆绑他所说的“主动”来提取更精确的指导是没有意义的。(需要明确的是,一般来说,不可能说有多少“太多”是……。)
“每个核心有 4 - 20 个活动线程通常是可以接受的”。——亚当·坦农
In this sense I think the word means "ready to run" rather than "alive" or any of the other possible meanings. It makes sense to have no more than a handful of threads on the ready queue, because you're not getting any value for the waiting threads, and you contribute to scheduling and context switch overhead. On the other hand, if you have fewer ready-to-run threads than cores, you aren't making use of the available resource.