我有一個系統,它在接收到來自web服務的調用時啓動worker。工作人員由ExecutorService啓動,啓動的類實現Runnable。但是,如果員工超時,我無法真正殺死工人,這導致我的系統出現資源問題。Java:通過ExecutorService殺死作爲Runnable啓動的線程
public class MyClass implements Runnable {
public void internalCall() {
logger.info("B-1");
//Some business code which may take too long
// <...>
logger.info("B-2");
}
public void launch() {
// Wrapper
Callable<Object> callable = new Callable<Object>() {
@Override
public Object call() throws Exception {
internalCall();
return null;
}
};
// Submit
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Object> future = executor.submit(callable);
try {
// Wait
future.get(1, TimeUnit.SECONDS);
}
catch (TimeoutException e) {
logger.warn("Timeout");
}
finally {
logger.info("A-1");
executor.shutdownNow();
future.cancel(true);
logger.info("A-2");
}
}
}
如果工作超時,我希望下面的日誌消息:
INFO | B-1
WARN | Timeout
INFO | A-1
INFO | A-2
其次是服務剩餘空閒直到另一名工人請求到來然而,儘管調用shutdownNow時()和取消。 ()上的ExecutorService和未來體面,工作人員繼續說:
INFO | B-1
WARN | Timeout
INFO | A-1
INFO | A-2
INFO | B-2
我環顧四周,並有許多其他類似的問題,關於殺害threa ds,普遍認爲你不應該這樣做。然而,這是一個可以擴展的類,意圖覆蓋internalCall() - 這意味着我不能依靠internalCall來自我檢查並檢查Thread.isInterrupted()或類似的東西。
我想通過攻擊furure或executor對象來強制從launch()方法中殺死東西。
工作線程由執行程序服務維護 - 它們只是由提交的任務「借用」,通常用於許多任務執行。你不允許簡單地「殺死」它們! – isnot2bad
那麼爲什麼不停止執行程序服務停止線程呢? – tim
ExecutorService嘗試停止這些線程,但如果您有錯誤的代碼,則不能保證它會發生。詳情請參閱我的回答。 –