我必须在主线程中等待工作线程的终止,然后(在某些事件中)我启动这些线程并再次等待终止,等等。
调用 join()
效果很好,但我想做得更快。
Phaser 看起来像我正在寻找的东西,但我做错了:
//*** application start ***
//create "empty" Phaser
//*** main thread ***
//event occured - start working threads
phaser.register();
//start working threads...
phaser.arriveAndAwaitAdvance(); //add arriveAndDeregister()?
// *** working thread start ***
phaser.register();
// do sth ...
// *** working thread end ***
phaser.arrive(); // replace with arriveAndDeregister()?
最佳答案
问题是您无法从正在注册的任务中调用phaser.register()
。使用移相器时始终遵循以下两条规则:
- 只有已注册的任务才能注册其他任务。这意味着任务无法注册自身。
- 所有已注册的任务必须在结束前取消注册。一个好的做法是使用移相器将代码包装在最后取消注册的
finally
block 周围(请参阅示例)。
以下是更改原始示例的方法:
//*** application start ***
//create "empty" Phaser
final Phaser phaser = new Phaser(1);
//*** main thread ***
//event occurred - start working threads
for (int i = 0; i < WORKERS; i++) { // spawn some workers
phaser.register(); // register the worker thread before starting it
Thread worker = new Thread(new Runnable() {
@Override
public void run() {
try { // wrap the worker's code with a finally, so you are sure the task will deregister from the phaser.
// Worker's code
// ...
// *** working thread end ***
// last operation is:
} finally { // Very important to wrap
phaser.arriveAndDeregister();
}
}
});
worker.start();
}
// wait for working threads...
phaser.arriveAndAwaitAdvance();
// repeat pattern above: phaser.register() + worker.start()
phaser.arriveAndAwaitAdvance();
// since the main task is done it deregisters itself from the phaser
phaser.arriveAndDeregister();
关于java - 使用和重用 Phaser 而不是 join(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856805/