我使用ExecutorService實現了TimeoutTask。在下面的方法中,我提交TimeoutTask,如果它在給定的時間內超時,我取消任務並關閉執行程序。使用ExecutorService的TimeoutTask
private boolean waitForProcessToBeCompleted(long timeOut) {
boolean result = false;
ExecutorService executor = Executors.newSingleThreadExecutor();
// Create a FutureTask which will be run
FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new TimeoutTask());
executor.submit(futureTask); // Run the FutureTask
try {
result = futureTask.get(timeOut, TimeUnit.MILLISECONDS); // Check if FutureTask completed in the given time
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
futureTask.cancel(true);
result = true; // Return True only when timed out
} finally {
executor.shutdownNow(); // Stop the executor
}
return result;
}
它運行得很好,我沒有任何問題。
但是,我想知道這是否是最好的代碼設計。我只是想知道使用由ExecutorService.submit()返回的Future來獲取Callable的返回值還是超時TimeoutTask會更好。例如
Future<?> futureTask = executor.submit(new TimeoutTask()); // Run the FutureTask
try {
result = futureTask.get(timeOut, TimeUnit.MILLISECONDS); // Check if FutureTask completed in the given time
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
futureTask.cancel(true);
result = true; // Return True only when timed out
} finally {
executor.shutdownNow(); // Stop the executor
}
return result;
我正在使用JDK7。
謝謝阿列克謝。但是,在上面的代碼設計中,我可以使用submit()返回的Future來獲取結果,而不是使用單獨的FutureTask。那有意義嗎? – ParagJ
它沒有意義,因爲通過submit(Callable)返回的Future實際上是FutureTask。這兩種方法可以做到這一點。 –
再次感謝。但是我只是想知道如果我使用submit()方法返回的Future對象,我不需要明確地聲明它。我只是使用返回值。不管怎樣,謝謝。 – ParagJ