如何将运行无限循环的线程限制为 1 个核心?
Posted
技术标签:
【中文标题】如何将运行无限循环的线程限制为 1 个核心?【英文标题】:How to limit a thread running infinite loop to 1 core? 【发布时间】:2013-11-11 20:56:02 【问题描述】:我一直在学习和试验 Java 中的多线程。 我有一个四核处理器(带有超线程)。 如果我有 1 个线程在它的 run() 函数中进入无限循环,它会使用我的 CPU 90%。
如何将其限制为 1 个核心(即 25%)或无法完成?我好奇地问。 提前谢谢你。
通过使用带有 BlockingQueue 而不是 executorService 的纯线程,我能够使用高达 90%/core。我还没有在 ExecutorService 上尝试 BlockingQueue - 但是使用并发列表,Executor 服务正在同步。
感谢大家的帮助!我真的很感激。
【问题讨论】:
实际上应该只使用 25%。您可能想看看您还运行了什么;也许你忘了关闭一些实例。如果能够如此轻松地从多核系统中获取所有处理能力,那就太棒了。 请注意,如果一个内核被充分利用,某些工具会报告 100% CPU。 查看调试窗口中的线程,会有不止一个处事。一个线程一次不能也不会使用超过 1 个核心。 如果你想限制它的原因是为了限制线程的资源消耗,那么你真的应该为此使用一些其他机制。例如,请参阅***.com/questions/1202184/… 你在那个循环中做什么?那有必要吗?也许在里面做一些短暂的睡眠会帮助你更好地利用你的 CPU。 【参考方案1】:单个线程最多可以利用一个内核的 100%。在四核机器上,Windows 任务管理器将此报告为 25% 的 CPU 使用率,而 Linux 任务管理器将此报告为 100% 的 CPU 使用率。
因此没有必要将此线程分配给一个内核,因为它在任何时候都不能使用多个内核。
【讨论】:
【参考方案2】:这有点取决于你的线程在做什么。
记住其他线程正在运行,例如垃圾收集器和几个 JIT 编译器线程。它们也会消耗 CPU。
根据我的经验,在一个单线程程序中拥有 300% 的 CPU(意味着您的程序使用 3 个内核)并在启动后具有大量 GC 负载的情况并不少见。一段时间后,当 JIT 完成大部分工作时,这将降级。
【讨论】:
【参考方案3】:你不能在纯 java 中做到这一点,你需要JNI
为你做到这一点。
看看this,也许对你有帮助。
【讨论】:
以上是关于如何将运行无限循环的线程限制为 1 个核心?的主要内容,如果未能解决你的问题,请参考以下文章