2014-02-24 77 views
0

我有一个循环迭代10次,并在每次执行一些相关的方法。所以有任何解决方案可以为该循环的每个实例paralally执行相同的任务。使用ExecutorService并行化一个循环做一个任务

1st core should execute the program for i=0,1,2,3 
2nd core should execute the program for i=4,5 
3rd core should execute the program for i=6,7 
4th core should execute the program for i=8,9 

假设我有4个核心

+0

http://stackoverflow.com/questions/4010185/parallel-for-java – devshorts

回答

0

查找到执行人及的ExecutorService。您可以创建一个线程池并在其上抛出任意数量的Runnables。举例来说,如果你想有每个核心一个线程,你可以这样做:

ExecutorService pool = 
    Executors.newFixedThreadPool(Runtime.getRuntime().getAvailableProcessors()); 

然后,你可以这样做:

pool.execute(myRunnable); 

有API文档一个很好的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

+0

如果我的系统有4个内核,我suppy 10代替Runtime.getRuntime()。getAvailableProcessors()然后会发生什么。 ..? – Bishnu

+0

谢谢你的回答....它是有用的.. !!继续帮助先生。 – Bishnu

+0

你可以拥有比核心更多的线程运行,实际上你并不常见。如果您的CPU线程非常密集,则限制池中线程的数量非常重要,以免压倒计算机。 – jgitter

1

我有一个循环迭代10次,每次执行一些相关methods.So时间是有可以为循环的每个实例执行相同任务parallaly任何解决方案。

首先要认识到的是,除非您使用第三方库,否则您没有对任务到核心映射的特定控制。总的来说,你不想这么做 - 只要让JVM明智就可以了。

要利用硬件上的所有内核,通常需要更改固定线程池中的线程数。您可以使用缓存线程池,根据提交到ExecutorService的任务数量增加任务。在现代的JVM和操作系统上,抖动并不是一个担心,所以这很适用,除非你正在谈论1000个任务。

但通常我在池中设置了固定数量的线程。如果任务的CPU占用率达到100%,那么我可以设置线程的数量以匹配JVM所具有的虚拟处理器的数量。通常使用日志输出,网络事务和其他IO,您可能需要增加线程数来利用所有处理器。我会用不同的值运行你的程序几次。

在你的情况下,你似乎想专门在一个线程中运行作业0,1,2,3,而4,5在另一个线程中并行运行(希望)。要完成此任务,您应该向ExecutorService提交4个任务,并让每个任务都运行您想要的迭代编号。

也许是这样的:

executorService.submit(new MyTask(new int[] { 0, 1, 2, 3})); 
executorService.submit(new MyTask(new int[] { 4, 5 })); 

如果线程映射的数量是任意的,那么我刚刚提交10个任务的ExecutorService,它会在FIFO方式并行运行的任务。

+0

它会使用我系统的所有可用内核......? – Bishnu

+0

@格雷:“除非你使用第三方库”,你能列出一些这些库吗?有兴趣知道他们是如何工作的。 – kosa

+0

n先生,谢谢你...优秀 – Bishnu