如何让 java.concurrency.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");
}
}
知道我做错了什么吗?或者有没有更好的方法来编写这些屏障同步方法?请帮忙。
I am writing code that will spawn two thread and then wait for them to sync up using the CyclicBarrier class. Problem is that the cyclic barrier isn't working as expected and the main thread doesnt wait for the individual threads to finish. Here's how my code looks:
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");
}
}
Any idea what I am doing wrong? Or is there a better way to write these barrier synchronization methods? Please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在执行主线程期间,您创建两个其他线程并告诉它们互相等待。但是你没有写任何东西让你的主线程等待它们并抱怨它不等待。顺便说
一句。除非必要,否则不要扩展 Thread 类。实现 Runnable 并将实现传递给 Thread 对象。像这样:
编辑
避免扩展线程的理由。
经验法则是尽可能减少耦合。继承是类之间非常牢固的联系。如果您想要更改 Thread 的某些默认行为(即覆盖某些方法)或想要访问 Thread 类的某些受保护字段,则必须从 Thread 继承。如果您不想要它,您可以选择更松散的耦合 - 实现 Runnable 并将其作为构造函数参数传递给 Thread 实例。
During execution of your main thread you create two other threads and tell them to wait for each other. But you wrote nothing to make your main thread to wait for them and complain it doesn't wait. Try
BTW. Don't extend Thread class unless you have to. Implement Runnable and pass implementations to Thread objects. Like this:
EDIT
Justification for avoiding extending Thread.
The rule of thumb is as little coupling as possible. Inheritance is a very strong connection between classes. You have to inherit from Thread if you want to change some of its default behaviour (i.e. override some methods) or want to access some protected fields of class Thread. If you don't want it, you choose looser coupling - implementing Runnable and passing it as a constructor parameter to Thread instance.
将
Runnable
实例传递给CyclicBarrier
的构造函数,如下所示。Pass a
Runnable
instance to the constructor of yourCyclicBarrier
like this.您正在寻找 Thread.join() 方法...
编辑:因为注释...
如果您不想永远等待,您还可以指定最大毫秒数加纳秒等待线程死亡
You are looking for Thread.join() method...
EDIT: because of the comments...
And if you don't want to wait forever you can also specify the maximum number of milliseconds plus nanoseconds to wait for the thread to die
在这种情况下,循环屏障不是正确的选择。您必须在此处使用
CountDownLatch
。我假设您正在从 main 方法调用
spawnAndWait
方法。这不起作用的原因是 CyclicBarrier 有 2 个构造函数。要执行后操作,您必须使用 2 参数构造函数。最重要的是要记住,主线程不会通过
await
方法等待;但仍将继续执行。但是,CyclicBarrier
构造函数中指定的线程仅当所有生成的线程在屏障处停止时才会运行(通过await
方法)Cyclic barrier is not the correct choice in this case. You must use
CountDownLatch
here.I assume you have are invoking
spawnAndWait
method from the main method.The reason this wont work is that the
CyclicBarrier
has 2 constructors. To perform post-operations you must use a 2 parameter constructor. The most important thing to remember is that the main thread will not wait by theawait
method; but will continue to execute. However the Thread specified in theCyclicBarrier
constructor will only run when all spawned threads stop at the barrier(by theawait
method)