2013-06-27 23 views
-1

如何使用SemaphoreThread类中获得join()的功能?如何更改加入信号量

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

+0

你想看看join()做了什么或者你想让你的线程等待其他线程完成吗? –

+0

@Kamen,我想停止线程,直到其他不会结束 –

+0

你有t1和t2。 t1应该等待t2完成。所以在t1应该等待的地方写下t2.join()就是这样。执行将停止在该行,直到t2完成。 –

回答

1

从你的问题我summise,你想要做什么Thread.join()不使用Thread.join()但使用Semaphore。我可以考虑一些你可能想要这样做的原因,但我觉得你可能只是想用join()。然而,在这里。

让我们先从什么join()不 - 摘自的javadoc

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(); 

你可能想通过信号开始到构造,如果之前你示例需要它,或者以其他方式访问它。请注意0​​在这里必须是final,因为它在匿名内部类中被引用,并且Java不会正确执行闭包。