如何让java.concurrency.CyclicBarrier按预期工作

Rit*_*yak 7 java concurrency multithreading cyclicbarrier

我正在编写将产生两个线程的代码,然后等待它们使用CyclicBarrier类进行同步.问题是循环障碍没有按预期工作,主线程不等待各个线程完成.以下是我的代码的外观:

 class mythread extends Thread{
   CyclicBarrier barrier;
   public mythread(CyclicBarrier barrier) { 
       this.barrier = barrier;
      }

   public void run(){
            barrier.await();
       } 
 }



class MainClass{
 public void spawnAndWait(){
    CyclicBarrier barrier = new CyclicBarrier(2);
    mythread thread1 = new mythread(barrier).start();
    mythread thread2 = new mythread(barrier).start();
    System.out.println("Should wait till both threads finish executing before printing this");
  }
}
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?或者有更好的方法来编写这些屏障同步方法吗?请帮忙.

Tad*_*pec 14

在执行主线程期间,您创建另外两个线程并告诉它们彼此等待.但你没有写任何东西让你的主线程等待他们并抱怨它不等待.尝试

CyclicBarrier barrier = new CyclicBarrier(3);
mythread thread1 = new mythread(barrier).start();
mythread thread2 = new mythread(barrier).start();
barrier.await(); // now you wait for two new threads to reach the barrier.
System.out.println("Should wait till both threads finish executing before printing this");
Run Code Online (Sandbox Code Playgroud)

BTW.除非必须,否则不要扩展Thread类.实现Runnable并将实现传递给Thread对象.像这样:

class MyRunnable implements Runnable {
    public void run(){
        // code to be done in thread
    }
}

Thread thread1 = new Thread(MyRunnable);
thread1.start();
Run Code Online (Sandbox Code Playgroud)

编辑
避免扩展线程的理由.
经验法则是尽可能少的耦合.继承是类之间非常强大的连接.如果要更改其某些默认行为(即重写某些方法)或想要访问Thread类的某些受保护字段,则必须从Thread继承.如果你不想要它,你选择更宽松的耦合 - 实现Runnable并将它作为构造函数参数传递给Thread实例.

  • @Chandru:嗯,要么“应该等到两个线程完成执行后再打印它”或异步。你不能异步等待。 (2认同)