簡體   English   中英

限制線程數和Java並發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM