![](/img/trans.png)
[英]How to know that no operation is running on ConcurrentHashMap or in Idle state in JAVA?
[英]How to force a Java REST application into Idle State?
我有一個約30個端點的REST應用程序。 除了這些,用戶還可以提交需要處理20-60分鍾的后台任務。 有時很明顯,提交的請求永遠不會從日志中完成,但是,我唯一能做的就是重新部署相同版本的代碼。
我希望能夠像通過mySQL殺死進程一樣殺死進程
'Show Process List' -> 'Kill <ProcessId>'.
我試圖用Thread.currentThread()。interrupt()來實現,但這實際上並沒有做任何事情。 我在整個應用程序中多次使用CompletionService和多線程來加速進程。
我的目標是我應該能夠調用此API,以使應用程序返回到沒有進程運行時的狀態。 我檢查了這篇文章,但似乎所有人都對此警告。
能做到嗎?
Thread.currentThread()
返回正在運行的當前線程的Thread對象,因此,如果在后台任務線程之外調用此對象,它將不會返回對后台線程的引用。 如果要引用您的后台線程,則必須自己對其進行跟蹤。
thread.interrupt()
在您的線程上設置一個中斷標志。 但是,如果您的線程從不顯式檢查中斷標志,則它不會執行任何操作。 您將必須定期檢查后台任務中的中斷標志,然后采取適當的措施。
if (Thread.currentThread().isInterrupted()) {
finishWork(); // Close any resources used.
return;
}
對於您的用例,我實際上不鼓勵在后台任務上使用interrupt(),尤其是在使用線程池的情況下。 特別是,如果您使用的是Threadpool,則可以重復使用同一線程來運行多個后台任務。 由於線程已被重用,因此可能會意外中斷您從未打算執行的后台任務。
這將需要做大量的工作,但這是可行的。 下面,我描述一個非常基本的實現,它將足以滿足您的用例。
UUID.randomUUID()
。 在執行此操作之前,請務必先閱讀如何正確同步Java中線程之間的通信。 這是一個很好的資源https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.