2015-09-04 175 views
2

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

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

方法一:一个线程定期查询数据库更改,启动(长时间运行)并行处理线程(无论何时发生更改)对更改数据起作用。 (工作涉及算术和坚持的结果数据库)

方法有两个:多个线程查询数据库中的数据发生变化,锁定修改的数据,每个线程启动一个线程(从一个线程池)此过程更改数据。

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

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

您有任何其他有效方法实施这种情况?

+2

通常情况下,在一台机器上运行多个JVM不会使应用程序更快 – ControlAltDel

+0

这样做是否也会投下一个问题? –

+0

由于缺乏具体的细节而下调并投票结束。仅仅说“线程”是不够的,我听到线程改善了一切!我们需要知道处理的细节 – ControlAltDel

回答

3

我认为你的答案归结为:

  • 处理,在一个过程中的一个线程,故事的结尾。
  • 在一个进程中处理多个线程。
  • 在多个进程中使用多个线程进行处理。

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

多个进程中的多个线程不买你多,有几个缺点:

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

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

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

相关问题