Java并发:协调多个任务并取消

Pau*_*hek 5 java concurrency multithreading

我正在寻找协调多个多线程任务的好解决方案.

基本上我有2个任务,我打电话AB需要被不同的线程比主线程中执行.

B必须在A完成后开始.A而且他们B自己包含几个应该并行运行的部分,叫做A1, A2, ... B1, B2, ....

并且有一个来自外部的呼叫者,无论进度如何,都需要重新启动整个工作.我怎么能这样做呢?如果每个子任务(A1,...)已经完成,我想创建一些保存信息的布尔数组,如果是,则启动B.如果已经取消,则检查每个方法中的每几行代码.但在我看来,这不是一个优雅的解决方案,并且有可能以令人兴奋的方式协调这一点.

在此输入图像描述

jav*_*ter 0

以下是使用 countDownLatches 和 Exectors 的示例实现:

public class Test {
    static ExecutorService maintaskExecutor = Executors.newFixedThreadPool(2);

    private static CountDownLatch latch = new CountDownLatch(0);


    public Test() {
    }


    public static void main(String[] args) {
        maintaskExecutor.submit(new runnableA());
        maintaskExecutor.submit(new runnableB());

    }

    private void restart() {
        maintaskExecutor.shutdownNow();
        maintaskExecutor.submit(new runnableA());
        maintaskExecutor.submit(new runnableB());
    }


    private static class runnableA implements Runnable {
        ExecutorService taskExecutorA = Executors.newFixedThreadPool(3);
        private final CountDownLatch latchA = new CountDownLatch(3);


        @Override
        public void run() {

            try {
                Runnable a1Runnable = createA1Runnable();
                Runnable a2Runnable = createA1Runnable();
                Runnable a3Runnable = createA1Runnable();

                taskExecutorA.submit(a1Runnable);
                taskExecutorA.submit(a2Runnable);
                taskExecutorA.submit(a3Runnable);

                latchA.await();
                latch.countDown();
            } catch (InterruptedException e) {
                taskExecutorA.shutdownNow();
            }
        }

        private Runnable createA1Runnable() {
            return new Runnable() {
                @Override
                public void run() {
                    //Design this task to respond to interruption by checking if the thread has been interrupted
                    while(!Thread.interrupted()){
                        //Do the work
                    }

                    return;
                }
            };
        }
    }

      private  static class runnableB implements Runnable{
              private final CountDownLatch latch = new CountDownLatch(3);
              ExecutorService taskExecutorB = Executors.newFixedThreadPool(3);

              public void run(){
                  try {
                    latch.await();
                    //Creates the tasks B1, B2, ...


                } catch (InterruptedException e) {
                    taskExecutorB.shutdownNow();
                }
             }
}

}
Run Code Online (Sandbox Code Playgroud)