[英]Check if ALL the waiting threads are in waiting state and not working
我有一個extends Thread
的ProcessesManager
類。 在run()
方法內部,我正在這樣做:
public void run() {
while(true)
synchronized (GlobalVariables.queue) {
while (GlobalVariables.queue.isEmpty())
// Threads are waiting here...
GlobalVariables.queue.wait();
// Get the next work item off of the queue
work = GlobalVariables.queue.remove();
}
}
在main方法中,我正在創建ProcessesManager
類的四個實例(線程)。
for (int i = 0; i < 4; i++) {
ProcessesManager processesManager = new ProcessesManager();
processesManager.start();
}
他們正在等待queue
。 隊列一開始是空的,然后我開始填充隊列,線程開始處理隊列項目。 現在,線程同時從隊列中刪除項目/將項目添加到隊列中。 程序本身沒有“終點”。 但要清楚一點,程序的結尾是1。隊列為空。 2.所有線程正在等待並且不再工作。
現在,我想實現一種檢查三個條件的方法:
檢查隊列是否為空。
檢查是否所有線程都在等待,沒有線程在做任何工作。
檢查它是否不是應用程序的啟動(自啟動以來,以上兩個條件在一段時間內會成立)。
如果滿足以上所有條件,我想退出/關閉該應用程序。
我可以通過簡單地檢查GlobalVariables.queue.isEmpty()
方法來檢查條件1。 但是我不知道如何檢查所有線程是否處於等待狀態。 我也可以找到第三個條件的解決方案。
如何檢查所有線程是否都在等待並且不再工作?
編輯
我正在使用本教程: http : //www.drdobbs.com/parallel/java-concurrency-queue-processing-part-1/232700457 。 有沒有知道程序結束的方法?
結合使用ReentrantLock和condition,它有許多方法可以解決您的問題https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html
需要明確的是,程序的結尾是1。隊列為空。 2.所有線程正在等待並且不再工作。
假設您的工作線程平均比填充隊列的生產者快。 在那種情況下,隊列在大多數時間將是空的,而工人將在很多時間等待。 在您的方案中,如果隊列為空,並且工作人員都閑置,則無法判斷這是因為生產者確實完成了,還是僅僅是因為生產者添加下一個項目有點慢。
也許在您的應用程序中,生產者永遠不會那樣落后,但是您的代碼中沒有任何東西可以保證它永遠不會那樣落后。
您正在實現的東西稱為線程池 (例如,像java.util.concurrent.ThreadPoolExecutor
)。 在大多數線程池實現中,生產者可以通過某種方式顯式關閉該池(例如ThreadPoolExecutor.shutdown()
)。
實現關閉的一種方法是使用毒葯 -一種特殊的任務,告訴拉它的工作線程終止。 當需要關閉池時,調用者只需為隊列加載至少至少與服務線程的工作線程數量一樣的毒葯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.