java - 如何让Java使用多线程线程?

标签 java multithreading

这是一个与出现在以下位置的问题类似的问题:How to ensure Java threads run on different cores .然而,在 Java 中可能已经取得了很大的进步,而且,我找不到我在那个问题中寻找的答案。

我刚写完一个多线程程序。该程序产生了多个线程,但似乎只使用了一个内核。该程序更快(我正在并行化使其更快的东西),但它肯定不会使用所有可用的内核,通过运行“top”来判断。

有什么想法吗?这是预期的行为吗?

一般的代码结构如下:

   for (some values in i)
   {
        start a thread of instantiated as MyThread(i)
        (this thread uses heavily ConcurrentHashMap and arrays and basic arithmetic, no IO)
        add the thread to a list T
   }

   foreach (thread in T)
   {
        do thread.join()
   }

最佳答案

如果它几乎恰好是一个 CPU 的 100%,则可能意味着您确实拥有

  • 一个核心线程负责所有工作,而其他核心线程则不做那么多。
  • 您锁定的一个资源,只有一个线程有机会运行。

如果您正在使用大约一个 CPU,这可能意味着这就是您的 CPU 的所有工作,因为您正在等待诸如 IO(网络和/或磁盘)之类的东西

我建议您查看 VisualVM 中线程的状态。它将帮助您确定哪些线程正在运行,并让您了解它们的行为模式。我还建议您使用 CPU 分析器来帮助找到瓶颈。

关于java - 如何让Java使用多线程线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534915/

相关文章:

java - 在 Jetty 上启用远程 JMX

java - 不变性是否保证线程安全?

来自另一个线程的 C# UnhandledException 不断循环

multithreading - SOAP::Lite - 使用 1.1 和 1.2 版的客户端在 mod_perl 中线程化

java - 泛型:Treeset 添加子类

java - 如何将 `this` 传递给 Dozer 字段映射?

java - 在 Java 中按值对自定义对象数组进行排序

c# - Microsoft TPL(任务并行库)与 Intel TBB(线程构建 block )

java - 跨多个线程的可变静态变量

java - Akka Future 线程永远不会被释放