我一直致力于一个java GUI应用程序,该应用程序在特定操作上执行某项任务。我一直在使用ExecutorService执行此任务。现在使用多个线程工作正常,但问题是我不想阻止我的GUI。用户可能想要取消当前操作并可能请求另一个操作。但是在使用ExecutorService时,我的主线程被阻止了。我想等待我的子线程完成,使用ExecutorService调用,同时仍然可以在GUI上工作。
更新的代码是:
ExecutorService child = Executors.newCachedThreadPool();
ExecutorService es = Executors.newCachedThreadPool();
@Action
public void doAction() {
/** Some Code goes here */
if(Condition){
if(!(es.isTerminated()||es.isShutdown())){
es.shutdownNow();
es = Executors.newCachedThreadPool();
}
es.execute(new Runnable() {
public void run() {
if(!(child.isTerminated()||child.isShutdown())){
child.shutdownNow();
child = Executors.newCachedThreadPool();
}
for(loopConditions){
child.execute(new Runnable() {
public void run() {
//Perform Some Task Here
}
});
}
child.shutdown();
try {
boolean finshed = child.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
child.shutdownNow();
Logger.getLogger(MySearchView.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("All Child Threads finished Execution");
}
});
es.shutdown();
try {
boolean finshed = es.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException ex) {
es.shutdownNow();
Logger.getLogger(MySearchView.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("All Threads finished Execution");
/**
* Code that should run after all Threads finishes their Execution
*/
}
}
答案 0 :(得分:2)
您没有按照预期的方式使用Executor
。它们应该是长期存在的,在应用程序启动时创建并在最后被拆除。在正常处理过程中不要使用shutdownNow
和awaitTermination
。
如果您要等待任务结果,请在提交时返回的get()
上致电Future
。
答案 1 :(得分:1)
我会使用ScheduledExecutorService在5秒后自行关闭。