2012-11-05 2 views
3

특정 작업에 대해 몇 가지 작업을 수행하는 Java GUI 응용 프로그램에서 작업했습니다. ExecutorService를 사용하여이 작업을 수행했습니다. 이제는 여러 스레드로 작업해도 문제가 없지만 GUI를 차단하고 싶지는 않습니다. 사용자는 현재 작업을 취소하고 다른 작업을 요청할 수 있습니다. 그러나 ExecutorService를 사용하는 동안 내 주요 스레드가 차단됩니다. ExecutorService를 사용하여 호출 된 자식 스레드가 GUI에서 계속 작업 할 수있을 때까지 기다려야합니다.자식 스레드 Finishe 때까지 기다리십시오, 그러나 주 스레드를 차단하지 마십시오.

업데이트 된 코드는 다음과 같습니다

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

ExecutorService를 사용하는 이유는 무엇입니까 (틀린 것은 틀림). 어쩌면 다른 방법이있을 수 있습니다. 아마도 ExecutorService가 적절한 방법 일 것입니다. – mKorbel

답변

1

내가 5 초 후 자체를 종료하기 위해 ScheduledExecutorService를을 사용합니다.

+0

하지만 너무 일찍 종료 할 수 없습니다. 작업을 완료하는 데 몇 초에서 몇 분이 걸릴 수 있으며 사용자가 새로운 작업을 시작하지 않으려면 계속 진행해야합니다. –

+1

그런 경우 나는 새로운 행동을 취할 때 미래를 저장하고 취소 할 것입니다. 'if (future! = null) future.cancel (true); future = es.submit (새로운 MyNewTask());' –

2

의도 한 방식대로 Executor을 사용하고 있지 않습니다. 그것들은 수명이 길고, 응용 프로그램을 시작할 때 만들어지며 결국에는 찢어지기 마련입니다. 정상 처리 중에 shutdownNowawaitTermination을 사용하지 마십시오.

작업 결과를 기다리고 싶다면 제출할 때 반환 된 Future에서 get()으로 전화하십시오.

관련 문제