我有一個關於管理線程的簡單問題。我有3個程序共享同一個信號量和一個許可證。在正常情況下,第一個過程需要此許可證,並在第二個過程中發佈兩個許可證。第二個流程版本3允許第三個流程。我舉了一個例子來說明我的問題。使用信號量造成死鎖
第一招:
public class Process0 extends Thread{
Semaphore s;
public Process0(Semaphore s){
this.s = s;
}
public void run(){
try {
sleep(20000);
s.acquire();
System.out.println("hello");
} catch (InterruptedException ex) {
Logger.getLogger(Process.class.getName()).log(Level.SEVERE, null, ex);
}
s.release(2);
}
}
第二個過程:
public class Process1 extends Thread{
Semaphore s;
public Process1(Semaphore s){
this.s = s;
}
public void run(){
try {
this.sleep(10000);
s.acquire(2);
System.out.println("Hello 2");
} catch (InterruptedException ex) {
Logger.getLogger(Process1.class.getName()).log(Level.SEVERE, null, ex);
}
s.release(3);
}
}
還有最後一:
public class Process2 extends Thread{
Semaphore s;
public Process2(Semaphore s){
this.s = s;
}
public void run(){
try {
System.out.println("Acquire process 3 ");
s.acquire(3);
System.out.println("Hello 3");
} catch (InterruptedException ex) {
Logger.getLogger(Process2.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
的問題。當我運行這三個過程並確保過程3是第一個執行acquire
。我會陷入僵局。進程2從不打印「Hello 3」,進程1從不打印「Hello 2」。爲什麼?
信號量s =新的信號量(1);
Process0 p = new Process0(s);
Process1 p1 = new Process1(s);
Process2 p2 = new Process2(s);
p.start();
p1.start();
p2.start();
您如何確保流程3首先獲得它?首先啓動並不意味着它會先執行。對於這個問題,睡覺也沒有。 – zubergu
我在獲取Process和Process1 – Mehdi
之前添加睡眠,可能會或可能無法完成您想要的操作。根據線程執行順序來設計應用程序從一開始就是錯誤的。 – zubergu