我正在創建一個程序,它從用戶接收參數,執行一些複雜的計算,並將值返回給用戶。由於這些計算通常需要一些時間,我希望用戶能夠隨時暫停/恢復或停止計算。我使用多線程來運行計算,但由於我正在使用future.get()來檢索解決方案,因此在計算完成時GUI不響應。這裏是我的代碼:防止future.get()使GUI無法響應以實現暫停按鈕
System.out.println("Starting all threads...");
ExecutorService exec = Executors.newCachedThreadPool();
int threadCount = 4;
int amount = 10000000;
StringBuilder s = new StringBuilder();
for(int i = 0; i < threadCount; i++) {
Future<String> future = exec.submit(new Simulator(inputVariable1,inputVariable2,
inputVariable3, inputVariable4, inputVariable5, inputVariable6, amount/threadCount));
//No these are not the real variable names
try {
s.append(future.get()).append("\n");
} catch (InterruptedException | ExecutionException ex) {
Logger.getLogger(StartGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
int length = (int)(Math.log10(amount)+1);
int start = 0;
int totalWins = 0;
int totalLosses = 0;
for(int i = 0; i < threadCount; i++) {
int pos = s.indexOf("Wins: ",start);
int end = s.indexOf("Losses: ",start);
totalWins += Integer.parseInt(s.substring(pos+6,end-1));
totalLosses += Integer.parseInt(s.substring(end+8,end+7+length));
}
println("Total wins: " + totalWins + "\n" + "Total losses: " + totalLosses);
正如你所看到的,我創建了4個線程,每個線程運行的計算,然後收集來自各個使用的Future.get()的結果。我遇到的問題是我無法在GUI中實現暫停/恢復/停止按鈕,因爲future.get()方法會使GUI無法響應,直到它檢索到數據。關於我能做些什麼來解決這個問題的任何想法?
只是爲了記錄在案,可以測試'Future',看它是否與'做的Future.isDone()'。 – Gray