2011-11-22 79 views
1

我需要澄清一个与多线程相关的问题。我有线程获取信号量,并在一段时间后释放它。一旦它释放了第一个信号量,它就获得第二个信号量,然后释放它。两个信号量都保护了线程run()方法中的不同代码。类似下面:带信号量的多线程

public void run() { 
    System.out.println("Step 1"); 
    semaphoreA.acquire(); 

    // Run for a while 

    semaphoreA.release(); 

    // Run for a while 

    semaphoreB.acquire(); 
    System.out.println("Step 2"); 

    // Run for a while 

    semaphoreB.release(); 
} 

所以,在没有许可证的semaphoreB,线程等待。但是,当许可证可用时,我不应该在控制台上看到“步骤2”吗?或者,线程和信号量如何工作?

我想了解如果一个线程刚刚通知可用的信号量许可会发生什么。该线程是否会从头开始?或从它剩下的点开始?

+1

实例化信号量的代码? – vanza

+0

这就是它应该如何工作。你看到了什么。具体的问题更容易回答。 –

+0

你好,保罗!我看到'步骤1'。我想要线程移动到第2步,通过获取信号量B。 –

回答

0

假设你实例化semaphoreA,并与新的信号量SemaphoreB(1,TRUE)充其量你会看到:

步骤1

步骤2

如果其他线程获取信号量,直至它被释放,这个线程只是等待它的位置。换句话说,你永远不会步骤1,但永远不会两次。根据是否有任何信号量被释放,您可能看不到第2步。