2015-07-11 81 views
3

下午好一切,Java的信號燈停止線程

我與Java的信號量和併發工作的一個學校項目,並有關於它是如何工作的幾個問題!

如果沒有可用的許可證,我需要該線程退出「隊列」 - 不只是睡覺,直到準備就緒。這可能嗎?正如你可以在我的try, catch, finally看 - 有沒有處理此事件:

try { 
    semaphore.acquire(); 
    System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString()); 
    Thread.sleep(3000); 
} 
catch (InterruptedException e) { 
    e.printStackTrace(); 
} finally { 
    semaphore.release(); 
    System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString()); 
} 

丹尼爾帶來了tryAquire功能 - 這看起來不錯,但我已閱讀狀態的教程,信號燈需要try, catch, finally塊,以防止死鎖。我的當前代碼(實現0​​)將在finally塊中發佈,即使該線程從未獲取。你有什麼建議嗎?

public void seatCustomer(int numBurritos) { 
    try { 
     if(semaphore.tryAcquire()) { 
      System.out.println(Thread.currentThread().getName() + " aquired for 3 seconds " + semaphore.toString()); 
      Thread.sleep(3000); 
     } else { 
      System.out.println(Thread.currentThread().getName() + " left due to full shop"); 
     } 

    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     semaphore.release(); 
     System.out.println(Thread.currentThread().getName() + " released " + semaphore.toString()); 
    } 
} 

回答

4

我建議你閱讀JavaDoc中Semaphor。特別是,看看tryAcquire方法。

只有在調用時有可用信號量的情況下才從該信號中獲取許可。

獲取許可證(如果有許可證並立即返回,值爲true),將可用許可證數減1。

如果沒有許可證可用,則此方法將立即返回false值。

這是什麼意思是你可以嘗試獲得許可證,如果有的話。如果沒有可用的,這個方法立即返回false而不是阻塞。

你必須讓你的「終於」阻止一點智慧。

boolean hasPermit = false; 
try { 
    hasPermit = semaphore.tryAcquire(); 
    if (hasPermit) { 
     // do stuff. 
    } 
} finally { 
    if (hasPermit) { 
     semaphore.release(); 
    } 
} 
+0

謝謝丹尼爾!這是我一直在玩,但我的try/catch/finally塊釋放從未獲得的線程=/ –

+0

我已更新我的答案,包括如何在finally塊中處理它。 – Daniel

+0

這是門票 - 非常感謝你的幫助@Daniel –