[英]Restricting thread count and Java concurrency
我找不到使用最新的JAVA並發例程的這種特定情況的示例。
我計划使用threads
來處理來自可能包含0到數千個請求的打開隊列中的項目。 我想限制,因此在任何給定時間,處理隊列項目的線程數不得少於0個且最多不超過10個。
是否有針對此類特定情況的Java並發進程?
我認為您正在尋找線程池。 看一下ExecutorService和Executors。
ExecutorService: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
執行者: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html
獲取一個新的Thread固定線程池,該線程池可處理的最大線程數。 一次10個線程:
ExecutorService threadPool = Executors.newFixedThreadPool(10);
使用Submit方法,您可以將Callables或Runnables傳遞到池中。
對於您的用例,您需要一個調查隊列的進程,如果有新請求,則必須創建一個Callable或Runnable並將其傳遞給線程池。 池確保最大。 一次執行10個線程。
這是一個非常小的教程: http : //www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/group.html
使用線程池的一件好事是,submit方法返回一個Future對象,該對象支持已執行線程的返回類型。
將來: http : //docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html
我希望這可以幫助您解決問題。
我有相同的任務:我使用了java.util.concurrent
包的BlockingQueue
。 我創建了X個工作線程,該線程從隊列中讀取一個動作,對其進行處理,並在准備好時執行下一個動作。 這很簡單,而且效果很好。
如果您使用X = 10個工作線程,那么您的任務就解決了。
看起來您需要一個具有corePoolSize = 0和maximumPoolSize = 10的線程池執行程序。
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
如果您實際上無權訪問線程的創建,而僅管理隊列訪問,則解決方案可能只是使用Semaphore
對象(請參閱docs頁面 )。
這個想法是要以與訪問隊列相同的方式訪問全局信號量,將其初始化為數量max_threads
(例如10)。
訪問用於項目處理隊列之前,一個線程會首先獲得來自信號,如果這將阻止許可證max_threads
線程數量已經從隊列中開始處理項目。
在某個項目由某個線程處理后,該線程最終應釋放許可,從而允許更多線程處理其他項目。
請注意,許可證的獲取/釋放應使用try-finally塊來完成,這樣,即使從項目處理中拋出了某些異常,信號量仍保持一致狀態。 該代碼應如下所示:
semaphore.acquire().
try {
// retrieve item from queue and process it
}
finally {
semaphore.release();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.