如何使6个线程顺序运行多个任务

时间:2016-07-06 19:05:10

标签: java multithreading concurrency

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

1 个答案:

答案 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那么多的线程。