public class ProcessImpl implements Process {
@Override
public void process() {
List<Callable<Boolean>> tasks = new ArrayList<>();
for (int x = 1; x <= 5; x++) {
tasks.add(createTask(x));
}
for (int i = 1; i <= 6; i++) { //for each group, there are 6 groups
//this is a sequential executor
//DefaultThreadExecutor extends AbstractThreadExecutor
ExecutorService threadExecutor = new DefaultThreadExecutor();
try {
threadExecutor.invokeAll(tasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Callable<Boolean> createTask(final int i) {
Callable<Boolean> task = new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
System.out.println("Performing task " + i + " on thread - " + Thread.currentThread().getName());
return true;
}
};
return task;
}
}
在这段代码threadExecutor.invokeAll(tasks);
中,任务在Main
线程上执行。它打印的内容如下:
Performing task 1 on thread - main
Performing task 2 on thread - main
Performing task 3 on thread - main
Performing task 4 on thread - main
Performing task 5 on thread - main
Performing task 1 on thread - main
我希望每个组都有一个线程,所以共有6个线程,每个线程应该按顺序完成5个任务。
如何更改process()
才能实现此目标?因此,每个线程都在同时处理5个任务,每个线程不等待任何其他线程。
结果(可能会随着我将要介绍的随机睡眠而变化)
Performing task 1 on thread - group1
Performing task 1 on thread - group2
Performing task 2 on thread - group2
Performing task 1 on thread - group3
Performing task 2 on thread - group1
Performing task 3 on thread - group2
答案 0 :(得分:0)
您需要使用
@Override
public void process() {
List<Callable<Boolean>> tasks = new ArrayList<>();
for (int x = 1; x <= 5; x++) {
tasks.add(createTask(x));
}
ExecutorService service = Executors.newFixedThreadPool(5 or 6 depending on how much threads you want to run in parallel);
for (int i = 1; i <= 6; i++) { //for each group, there are 6 groups
//this is a sequential executor
//DefaultThreadExecutor extends AbstractThreadExecutor
try {
service.invokeAll(tasks);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
初始化您的执行者服务。现在你所有的callable将排队等候你可用的CPU那么多的线程。