exec multiThread用于一个进程 - java

时间:2016-10-19 03:38:57

标签: java multithreading

我有一个问题,像这样:

我有一个包含50个元素的数组,我喜欢用每个元素计算,为了更快,如何分配5个线程,每个线程处理和计算10个元素,而不是与其他线程重复。

并记住线程的数量,如变量,可能是5或10或任何数字。 我尝试使用:

ExecutorService executor = Executors.newCachedThreadPool();
for(int i = 1; i <= 5; i++){  //mycalculate }

但是所有5个线程都只是先处理10个元素。

任何人都可以帮助我!请。

(希望你理解我的问题,我的英语不好)

由于

2 个答案:

答案 0 :(得分:0)

ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 1; i <= 5; i++) {  
    int final taskNo = i;
    executor.submit(new Runnable() {
        public void run() {
           // perform 'mycalculate' for task 'taskNo'
        }
    });
}

(可以使用lambdas写得更整齐,但是现在让我们坚持使用“经典Java”方式。)

这不涉及如何等待任务完成的问题。为此,您可以捕获Future返回的submit个对象,并在每个对象上调用get

如果任务更改了任何共享对象,它也不会处理任何必要的同步。

  

我想用每个元素计算,以便更快...

如果'mycalculate'任务很长,并且任务不会相互干扰,并且你有多个核心,这种方法应该会有一些加速。

答案 1 :(得分:0)

尝试这样的并行流。

SomeClass[] array = new SomeClass[50];
// fill array
Stream.of(array)
    .parallel()
    .forEach(e -> /* calculate */);