我有“Creator”类,它具有创建线程的匿名内部可运行类。我还有创建GUI的GUI类,按下按钮执行“Creator”类。但随后我的GUI冻结,直到“Creator”创建的所有线程都完成。我发现SwingWorker可以在这种情况下帮助我,但我不明白如何在这种特殊情况下创建一个。除了SwingWorker,还有其他简单的方法吗?
以下是我的Creator类的代码:
public class Creator {
final ExecutorService es;
Collection<Future<?>> futures = new LinkedList<>();
public Creator() {
es = Executors.newFixedThreadPool(10);
}
public void runCreator() {
for (int i = 0; i < 100; i++) {
futures.add(es.submit(new Check(i)));
}
es.shutdown();
for (Future<?> future : futures) {
try {
future.get();
} catch (Exception ex) {
}
}
}
private class Check implements Runnable {
private int i;
private Check(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println("Number: "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
}
}
答案 0 :(得分:0)
您的代码在完成之前挂起的原因是由于您对Future's get method的调用。这将等到它完成。此外,您可能不希望在添加所有线程后立即关闭池。最好只添加一个关闭事件并在那里关闭它。
由于你正在做的就是打印一个数字并且正在睡觉,所以你不需要等待Future完成。只需删除对get的调用,就应该停止延迟。
答案 1 :(得分:0)
是的,Swing worker是可行的方法 - 网上有足够的示例,但总结一下 - 将您的线程生成和等待代码放在doInBackground()
中,如果您想报告临时进度,请使用{ {1}}最后,将您的数据发送到publish()/process()
中的Swing EDT主题。
PS。与SwingWorker使用无关,您可能需要考虑使用完成服务,而不是按顺序等待所有期货。