當我在 Java 中試驗 Future 和 Callable 時,我得到了一個我目前的理解無法理解的結果。以下場景僅用于演示目的。
據我了解,當通過呼叫將 s集合Callable提交給 an時,會回傳它從中獲得的第一個結果。檢索結果后,我呼叫了我希望關閉 executorService 的方法,因為它已經回傳了結果。但是,對于以下情況,程式會停止。我也試過打電話,但沒有運氣。ExecutorServiceinvokeAny()ExecutorServiceexecutorService.shutDown()executorService.shutDownNow()
我已經使用兩種方法嘗試了相同的示例,它們分別只讓他們的執行緒睡眠1000和5000幾秒鐘,并且在第一個完成后,睡眠executorService.shutDown()按預期作業。
我唯一的猜測是,shutDown()或者shutDownNow()不能像這樣中斷已經執行的執行緒cancel(mayInterruptIfRunning=true)。
有人可以解釋一下這里發生了什么,我猜對了嗎?
這是示例:
public class InvokeAnyExample {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
int N = 50; // If I set N = 10, program exits successfully.
ExecutorService executorService = Executors.newFixedThreadPool(2);
Callable<Long> naiveFibonacci = () -> {
log("Naive Fibonacci");
long result = fibonacciNaive(N);
log("Naive Fibonacci Finished");
return result;
};
Callable<Long> optimizedFibonacci = () -> {
log("Optimized Fibonacci");
long[] cache = new long[1000];
Arrays.fill(cache, -1);
long result = fibonacciOptimized(N, cache);
log("Optimized Fibonacci Finished");
return result;
};
Long result = executorService.invokeAny(Arrays.asList(naiveFibonacci, optimizedFibonacci), 5, TimeUnit.SECONDS);
log(String.valueOf(result));
executorService.shutdown();
// executorService.shutdownNow();
}
private static long fibonacciNaive(int n) {
if (n == 0 || n == 1) return n;
return fibonacciNaive(n - 1) fibonacciNaive(n - 2);
}
private static long fibonacciOptimized(int n, long[] cache) {
if (n == 0 || n == 1) return n;
if (cache[n] != -1) return cache[n];
long result = fibonacciOptimized(n - 1, cache) fibonacciOptimized(n - 2, cache);
cache[n] = result;
return result;
}
private static void log(String message) {
String prefix = Thread.currentThread().getName();
System.out.println(String.format("In Thread (%s) : %s", prefix, message));
}
}
這是輸出:
In Thread (pool-1-thread-2) : Optimized Fibonacci
In Thread (pool-1-thread-1) : Naive Fibonacci
In Thread (pool-1-thread-2) : Optimized Fibonacci Finished
In Thread (main) : 12586269025
--- PROGRAM HALTS
uj5u.com熱心網友回復:
正如 Mark Rotteveel 在他的評論中所寫:
naiveFibonacci任務不可中斷。它不呼叫任何檢查執行緒中斷狀態的方法,方法本身也不fibonacciNaive()檢查執行緒的中斷狀態。
如果要使fibonacciNaive()方法可中斷,可以將其更改為:
private static long fibonacciNaive(int n) throws InterruptedException {
if (n == 0 || n == 1) return n;
if (Thread.interrupted()) {
log("interrupt detected");
throw new InterruptedException();
}
return fibonacciNaive(n - 1) fibonacciNaive(n - 2);
}
隨著這種變化naiveFibonacci,一旦optimizedFibonacci產生結果,任務就會停止。
已更改:正如 Holger 評論的那樣,使用Thread.interrupted()比使用更可取,Thread.currentThread().isInterrupted()因為if陳述句中的代碼正在處理中斷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447444.html
下一篇:WPF轉換器:無法將“System.Int32”型別的物件轉換為“System.Windows.Controls.ListViewItem”型別
