我有一个问题,像这样:
我有一个包含50个元素的数组,我喜欢用每个元素计算,为了更快,如何分配5个线程,每个线程处理和计算10个元素,而不是与其他线程重复。
并记住线程的数量,如变量,可能是5或10或任何数字。 我尝试使用:
ExecutorService executor = Executors.newCachedThreadPool();
for(int i = 1; i <= 5; i++){ //mycalculate }
但是所有5个线程都只是先处理10个元素。
任何人都可以帮助我!请。
(希望你理解我的问题,我的英语不好)
由于
答案 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 */);