Java 带信号量的多线程处理

Java 带信号量的多线程处理,java,multithreading,semaphore,Java,Multithreading,Semaphore,我需要澄清一个与多线程相关的问题。我有获取信号量的线程,过一段时间后释放它。一旦完成释放第一个信号量,它就会获得第二个信号量,然后释放它。这两个信号量都在线程的run()方法中保护不同的代码。如下所示: public void run() { System.out.println("Step 1"); semaphoreA.acquire(); // Run for a while semaphoreA.release(); // Run

我需要澄清一个与多线程相关的问题。我有获取信号量的线程,过一段时间后释放它。一旦完成释放第一个信号量,它就会获得第二个信号量,然后释放它。这两个信号量都在线程的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();
}
所以,当不允许信号灯B时,线程将等待。然而,当许可证可用时,我不应该在控制台上看到“步骤2”吗?或者线程和信号量就是这样工作的


我想了解一下,如果一个线程刚刚收到关于可用信号量许可证的通知,会发生什么情况。那条线会从头开始吗?还是从它留下的地方开始

假设您用新的信号量(1,true)实例化了信号量A和信号量B,最多您会看到:

第一步

步骤2


如果另一个线程获取信号量,直到它被释放,这个线程只是在原地等待。换句话说,你永远不会一次迈出第一步,但决不会两次。您可能会看到或看不到步骤2,这取决于是否释放了任何信号量。

实例化信号量的代码?这就是它应该如何工作的。你看到了什么。一个具体的问题更容易回答。你好,保罗!我看到了“第一步”。我想让线程转到第2步,通过获取信号量B,我可以简化这个问题。我想了解一下,如果一个线程刚刚收到关于可用信号量许可证的通知,会发生什么情况。那条线会从头开始吗?还是从它留下的地方开始?