簡體   English   中英

Java確保線程的完成沒有中斷

[英]java ensure completion of a thread without interruption

我有許多正在運行的線程,但是我想執行一個特定的線程(TimerTask的run()方法)以完成其運行,並且我不希望任何其他線程中斷。

我認為synced(this){}無法確保其完成。

請為我建議正確的方法。

通常,您不能阻止Thread被“中斷”,但這並不意味着計算將被取消。 只是任何睡眠/等待操作都會引發異常。 參見javadoc

如果您不想退出,則可以捕獲InterruptedException並吞下它

工作完成后,您可以捕獲InterruptedException並設置interrupt狀態。

不可取消的任務

有些任務只是拒絕被打斷,使它們無法取消。 但是,即使不可取消的任務也應嘗試保留中斷狀態,以防不可取消任務完成后調用堆棧上的較高代碼希望對中斷采取措施。 清單6顯示了一種方法,該方法在阻塞隊列上等待,直到某個項目可用為止,無論它是否被中斷。 為了成為一個好公民,它會在完成后以finally塊的形式恢復被中斷的狀態,以免剝奪呼叫者的中斷請求。 (它無法更早地恢復中斷狀態,因為這將導致無限循環-BlockingQueue.take()可以在進入時立即輪詢中斷狀態,如果找到中斷狀態集,則拋出InterruptedException。)

public Task getNextTask(BlockingQueue<Task> queue) {
boolean interrupted = false;
try {
    while (true) {
        try {
            return queue.take();
        } catch (InterruptedException e) {
            interrupted = true;
            // fall through and retry
        }
    }
} finally {
    if (interrupted)
        Thread.currentThread().interrupt();
}
}

“實際上,一個我想運行到完成的關鍵線程並沒有這樣做,日志顯示其他線程正在獲取它們的時間片,關鍵此后不會繼續。”

這聽起來根本不像操作系統調度問題。 聽起來更像是由於某些異常“關鍵線程”被阻塞或退出。

重復運行表明關鍵線程在不同的執行點停止

  • 聽起來比例外更有例外。

如果我錯了,並且由於有更多的就緒線程而不是核心線程,因此您的關鍵線程被搶占,則應提高關鍵線程的優先級,以免搶占它,(或減少包裝盒上的負載:) 。

唯一的其他可能性是您的線程正在使用大量數據,並且會遇到很多頁面錯誤。 在這種情況下,要獲得更多的RAM和/或SSD!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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