在四核处理器中运行8个以上的线程

时间:2013-01-10 14:27:00

标签: java multithreading jvm threadpool cpu-usage

我有一个包含10个线程和大量文本数据的线程池,我正在并行运行这些线程,我无法利用核心i7 vPro处理器的完整cpu resorce,有人帮我解决这个问题。我想要最大的CPU利用率。

4 个答案:

答案 0 :(得分:2)

在许多情况下,不是在每个线程中执行相同的操作而是执行单独的作业并使用同步的队列进行通信,从而获得更好的结果。尝试拆分应用程序,以便所有读取操作都从单个线程完成,然后将数据提供给工作线程进行处理,另一个线程进行后处理(如果有的话)。您可能会发现这种模型使用更多的处理能力,并且可以更快地完成工作。

答案 1 :(得分:1)

很可能你的开销高于CPU利用率。

  • 这可能是因为阅读文件并将其分解为句子需要时间。由于你没有看到100%的CPU,这是我的猜测。
  • 启动任务并将任务添加到其他线程的开销大大增加了每个任务的工作量。您可能会看到接近100%的CPU利用率,但速度远远低于您的预期。它甚至可能比使用一个线程慢。

除非您的JVM预热,否则您可能会发现这比使用多个线程更有区别。 (100个句子文件不够接近)

答案 2 :(得分:1)

如果每个线程除了处理它之外还应该从文件中读取句子,那么我怀疑磁盘在这种情况下是一个瓶颈。从单个磁盘进行并行读取通常会导致单个顺序读取的性能下降。

在我看来,你应该将所有内容留给一个线程,或者至少序列化阅读并使用单个生产者 - 多个消费者模式仅对句子处理并行化。

答案 3 :(得分:0)

多线程带来一些开销,包括将作业细分为任务,将作业提供给作业队列,然后让ThreadPoolExecutor执行作业,也可以在完成后合并结果。即使由于磁盘访问或其他共享资源而没有争用,我发现将作业细分为小于1毫秒也不值得花费。在具有多个套接字的大型计算机上运行时,由于缓存一致性开销增加,该阈值甚至更高。