每个JVM或每个CPU核心的线程

时间:2015-09-04 15:12:13

标签: java multithreading parallel-processing jvm cpu

如何根据每个JVM的CPU核心数创建线程与在多个JVM上运行的线程不同,创建CPU核心数上的线程数,条件是所有JVM在一个共享同一CPU的物理系统上运行? 换句话说,一个并行运行8个线程的多线程Java程序与在8个不同JVM上运行的同一个多线程程序共享同一个CPU?

我在下面给出了一些我可能用线程实现并行处理的方法,但是无法理解它们之间的本质区别?

方法一:线程定期查询数据库更改,并行启动(长时间运行)线程(每当发生更改时)对更改数据起作用。 (这项工作涉及算术并将结果保存到数据库中)

方法二:多个线程查询数据库中的数据更改,锁定修改后的数据,每个线程启动一个处理更改数据的线程(来自线程池)。

方法三:多个线程,本质上是从不同的JVM作为单独的进程运行,查询数据库,锁定它找到的已更改的记录并启动线程(从线程池中,每个线程都有,池中的最大线程数为CPU核心数)以处理更改数据。

第三种方法是否比其他两种更好?如果是/否为什么? (因为监视线程在不同的JVM上运行,所以每个人都可以创建与CPU核心一样多的线程?例如,在8核CPU中,在单独的JVM上创建8个监视线程(作为单独的进程),每个他们将更改作业提交到8的线程池?但是,这个参数不会失败,因为只有8个物理内核,处理器在任何时候只能运行8个线程吗?)

您还有其他有效的方法来实施此方案吗?

1 个答案:

答案 0 :(得分:3)

我认为你的答案归结为:

  • 在一个过程中使用一个主题处理,故事结束。
  • 在一个流程中使用多个线程进行处理。
  • 在多个进程中使用多个线程进行处理。

如果您的目标是尽可能多地使CPU饱和,并以最快的速度执行处理,那么答案通常是#2,在一个进程中有多个线程。

多个进程中的多个线程对您没有多大帮助,并且有几个缺点:

  • 如果所有线程都在同一个进程中,那么它们可以使用超薄互斥锁/锁( intra 进程互斥锁/锁),它们的性能明显优于 inter 处理互斥锁/锁。多个进程意味着使用内核提供的锁定原语,这些原语通常要慢得多。

  • 如果所有线程都在同一个进程中,它们都可以访问相同的内存,并将所有内存汇集在一起​​。将所有内容都放在一个堆中意味着数据共处,而托管可以提高CPU缓存性能。此外,如果必须在多个进程中的线程之间共享数据,则需要使用共享内存(在Java中很麻烦)或消息传递(这会复制数据,浪费CPU和内存)。

使用多个进程的唯一好处是您可以轻松执行权限分离。