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实例.