我有一个迭代10次的循环,并且每次执行一些相互关联的方法。所以有任何解决方案可以为该循环的每个实例进行相同的任务。
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 :(得分:1)
我有一个迭代10次的循环,并且每次执行一些相互关联的方法。所以有任何解决方案可以为该循环的每个实例并行执行相同的任务。
首先要意识到的是,除非您使用第三方库,否则您没有对核心映射的任务进行特定控制。一般来说,无论如何你都不想这样做 - 只要让JVM对它有所了解。
要利用硬件上的所有核心,通常需要更改固定线程池中的线程数。您可以使用缓存的线程池,这将根据提交给ExecutorService
的任务数量增加任务。在现代JVM和操作系统上,颠簸不用担心,所以除非你在谈论1000多个任务,否则这种方法很有效。
但通常我会在池中设置固定数量的线程。如果任务是100%CPU绑定,那么我可以设置线程数以匹配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 }));
如果线程映射的数量是任意的,那么我只需要向ExecutorService
提交10个任务,它将以FIFO方式并行运行任务。
答案 1 :(得分:0)
查看Executors和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