gpt4 book ai didi

java - 防止 future.get() 使 GUI 无响应以实现暂停按钮

转载 作者:行者123 更新时间:2023-11-29 03:25:51 25 4
gpt4 key购买 nike

我正在创建一个程序,它从用户那里获取参数,进行一些复杂的计算,然后将值返回给用户。因为这些计算通常需要一些时间,所以我希望用户能够随时暂停/恢复或停止计算。我正在使用多线程来运行计算,但由于我正在使用 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#get 阻塞,直到 Callable 完成,这意味着,您将阻塞事件调度线程,直到 Callable 完成,这意味着UI 无法再响应正在生成的事件...

更好的解决方案是使用 SwingWorker,这在概念上是相同的,只是它具有向 EDT 提供反馈的功能,具体来说,在本例中是 done 方法。它在工作人员完成时调用,但在 EDT 的上下文中调用,使其保存以更新 UI。

看看Concurrency in SwingWorker Threads and SwingWorker特别是……

关于java - 防止 future.get() 使 GUI 无响应以实现暂停按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com