2013-01-22 222 views
5

我對Java中信號量的概念並不十分清楚,並試圖理解它。Java中的信號量和線程池

我的理解是在閱讀oracle docs(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html)和其他一些頁面之後,其類似於a鎖定許可證數量。

它通常用於創建資源池。 在這裏我感到困惑,也有ThreadPoolExecutor,它可以給我一個線程池。那麼區別是什麼呢?在哪種情況下使用哪一個?

回答

1

ThreadPool是一個可以共同管理的多個線程池中的一個。在Java中ThreadPoolExecutor在爲Runnable或Callable執行時也有一個隊列,它可以返回一個Future,它允許您控制任務或獲取結果。

信號量只允許你獲得許多許可證,例如它最多可以允許兩個線程運行一些代碼。你需要運行一些線程才能達到目的,否則它們是不相關的。

順便說一句:我會閱讀Java 7的文檔,因爲Java 5.0已經停用了一段時間,Java 6幾乎在免費服務結束。

+0

感謝您指出Java 7文檔。我剛剛搜索並打開鏈接。 – mehta

+0

谷歌是有點過時的鏈接。它經常給你1.4.2。 –

+1

谷歌搜索:「Java 7 XXX」與XXX =該類的名稱99%的時間工作。例如:[搜索Java 7 Semaphore](https://www.google.co.uk/search?q=java+7+semaphore)。 – assylias

4

首先,有沒有這樣的事情愚蠢的問題...

Semaphore允許多個線程「獲取」的資源。他們應該檢查資源是否可用。它就像一個流量控制閥。

A Lock是爲獨家訪問。一次只有一個線程。

A ThreadPoolExecutor允許您使用有限的線程數運行一些代碼(Runnable或Callable類)。您不必費心自己構建它,它已經在JSE API中爲您實施。你可以用一些信號量和隊列來做你自己的事情......但是如果你沒有很好的理由,不要浪費你的時間。

想象你必須實現一個Web服務器,它接收到一些端口80的請求。你不想用同一個線程來監聽這個端口來處理整個請求(這是浪費資源......) 。您可以使用ThreadPoolExecutor處理請求,處理它並響應客戶端。 ThreadPoolExecutor可以配置爲利用當前的CPU:針對此架構和此任務的最佳威脅數量。

Concurrency in practice是一本不錯的書,可以提高您對此事的認識。

我希望這可以幫助你,並對我的基礎英語感到抱歉。