java - 使用和重用 Phaser 而不是 join()

标签 java multithreading join synchronization phaser

我必须在主线程中等待工作线程的终止,然后(在某些事件中)我启动这些线程并再次等待终止,等等。

调用 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()。使用移相器时始终遵循以下两条规则:

  1. 只有已注册的任务才能注册其他任务。这意味着任务无法注册自身。
  2. 所有已注册的任务必须在结束前取消注册。一个好的做法是使用移相器将代码包装在最后取消注册的 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/

相关文章:

java - 我必须在 maven spring mvc 中将上传的文件存储在哪里?

java从连续运行1000次的程序到多线程

sql - MySQL从多个选项中加入以选择一个值

MySQL:如果表 B 中存在记录,则返回表 A 的所有行和 true|false

sql-server - 该查询如何在执行计划中生成两个连接运算符?

java - 具体查询时如何设置fetchSize?

java - 如何在 JSF 应用程序中使用大量静态文本?

java - 序列化一个对象时未找到序列化程序

c# - 了解 Thread/BeginInvoke? [初学者]

c++ - OpenMP 性能影响 : private directive vs. 在构造中声明变量