反正是有超時計劃任務(殺線程)在春季,如果任務需要長期甚至掛起,因爲遠程資源不可用殺春季調度線程
在我的情況下,任務可以花費太長的時間,甚至掛起是因爲它們基於HtmlUnitDriver(Selenium)步驟序列,但它會不時掛起,我希望能夠爲要執行的線程設置時間限制。最多1分鐘。
我設置5分鐘的固定費率執行,初始延遲1分鐘。
在此先感謝
反正是有超時計劃任務(殺線程)在春季,如果任務需要長期甚至掛起,因爲遠程資源不可用殺春季調度線程
在我的情況下,任務可以花費太長的時間,甚至掛起是因爲它們基於HtmlUnitDriver(Selenium)步驟序列,但它會不時掛起,我希望能夠爲要執行的線程設置時間限制。最多1分鐘。
我設置5分鐘的固定費率執行,初始延遲1分鐘。
在此先感謝
簡短的答案是,有沒有簡單的或可靠的方式來殺死一個線程由於Java的線程執行的限制。 ExecutorService#shutdown()
是一種黑客和沉重。它最好在任務本身中處理這個問題,例如就像在網絡請求級別,如果您在套接字上發出REST請求超時。
或者,如果您執行某種類型的消息傳遞ala Actor模型(請參閱Akka),您可以發送一條來自「主管」的消息,以使Actor死亡。同時避免使用類似Netty的阻塞會有所幫助。
我也做了同樣前段時間下面這個例子:example
的基本思想是把你的代碼在一個類實現可贖回或可運行狀態,然後創建一個FutureTask無論你打算用給invoque你的線程Callable或Runnable類作爲參數。定義一個執行器,將你的FutureTask提交給執行器,現在你可以在try catch塊中執行x時間的線程,如果你的線程以一個timeoutException結束,你會知道它花了太長時間。
這裏是我的代碼:
CallableServiceExecutor callableServiceExecutor = new CallableServiceExecutor();
FutureTask<> task = new FutureTask<>(callableServiceExecutor);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(task);
Boolean exito = true;
try {
result = task.get(getTimeoutValidacion() , TimeUnit.SECONDS);
} catch (InterruptedException e) {
exito = false;
} catch (ExecutionException e) {
exito = false;
} catch (TimeoutException e) {
exito = false;
}
task.cancel(true);
executor.shutdown();
你解決這個問題? – Luciano 2013-03-15 13:47:38