-1

如何使用join()Thread类中获取功能Semaphore

我的意思是我想等待其他线程。

4

1 回答 1

1

根据您的问题,我总结出您想要做的事情Thread.join()不使用Thread.join()但使用Semaphore. 我可以想到一些你可能想要这样做的原因,但我觉得你可能只是想使用join(). 但是,这里有。

让我们join()从 javadocs 中的内容开始

Waits for this thread to die

我们可以假设这意味着停止运行。好的,所以我们需要一个Semaphore具有在线程死亡时释放的许可证。让我们假设您可以修改有问题的两个线程,即它们不是最终的。然后,您可以覆盖他们的run方法,以便第一个在信号量完成时释放信号量,第二个等待信号量在它开始之前被释放,即

final Semaphore sem = new Semaphore(1);
Thread t1 = new MyThreadOne(){
  {
    try{
      sem.acquire();
    }
    catch(InterruptedException e){ log(...); }
  }
  @Override
  public void run(){        
    super.run();
    sem.release();
  }
};
Thread t2  new MyThreadTwo(){
  @Override
  public void run(){
    try{
      sem.acquire();
    }
    catch(InterruptedException e){ log(...); }
    super.run();
  }
};
t1.start();
t2.start();

如果您的示例需要,您可能希望将信号量传递给构造函数,或者以其他方式访问它。请注意,sem它必须在final此处,因为它在匿名内部类中被引用,并且 Java 不能正确执行闭包。

于 2013-06-27T15:38:38.800 回答