等到子线程完成,但不要阻止主线程

时间:2012-11-05 08:32:57

标签: java multithreading swing executorservice

我一直致力于一个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
        */
    }
}

2 个答案:

答案 0 :(得分:2)

您没有按照预期的方式使用Executor。它们应该是长期存在的,在应用程序启动时创建并在最后被拆除。在正常处理过程中不要使用shutdownNowawaitTermination

如果您要等待任务结果,请在提交时返回的get()上致电Future

答案 1 :(得分:1)

我会使用ScheduledExecutorService在5秒后自行关闭。