我有給定隨機數(1到n)的線程並被指示按排序順序打印它們。我使用了信號量,以便獲得許可證數量=隨機數,並獲得比獲得的更多的許可證。Java - 沒有獲取信號量版本
獲得=隨機數;釋放= 1 +隨機數
信號量的初始許可證計數爲1.因此,隨機數1的線程應該獲得許可證,然後是2等等。
這是支持按以下
給出的文件有()的釋放許可線程必須通過調用獲取已獲得該許可證沒有要求。
問題是我的程序在n> 2後卡住了1。
我的程序如下:
import java.util.concurrent.Semaphore;
public class MultiThreading {
public static void main(String[] args) {
Semaphore sem = new Semaphore(1,false);
for(int i=5;i>=1;i--)
new MyThread(i, sem);
}
}
class MyThread implements Runnable {
int var;Semaphore sem;
public MyThread(int a, Semaphore s) {
var =a;sem=s;
new Thread(this).start();
}
@Override
public void run() {
System.out.println("Acquiring lock -- "+var);
try {
sem.acquire(var);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(var);
System.out.println("Releasing lock -- "+var);
sem.release(var+1);
}
}
輸出是:
獲取鎖 - 4
獲取鎖 - 5
獲取鎖 - 3
獲取鎖 - 2
獲取鎖定 - 1
釋放鎖 - 1
雖然如果我用tryAcquire修改我的代碼,它運行得非常好。 下面是新的運行實施
@Override
public void run() {
boolean acquired = false;
while(!acquired) {
acquired = sem.tryAcquire(var);
}
System.out.println(var);
sem.release(var+1);
}
有人可以解釋信號燈的許可證的獲取機制,當多張線程與不同的許可請求等待?
我很抱歉,我不能回答你的問題,但。不**在構造函數中執行'new Thread(this).start();'。由於您仍在構造函數中,因此對象不完整,您將部分初始化的對象提供給另一個方法,在這種情況下甚至會傳送給另一個線程。這真的很糟糕,不要這樣做。更好'擴展線程'而不是'實現Runnable',然後執行'new MyThread(i,sem).start();'或執行'new Thread(new MyThread(i,sem))。start();'。 – Vampire
噢,我會驗證這一點。感謝您指出。 – user1474053
@BjörnKautler而不是僅僅說「*這真的很糟糕,不要這樣做*。」試圖解釋*爲什麼*所以人們可以理解潛在的問題。 – dimo414