2016-03-05 4 views
1

У меня есть два экземпляра ExecutorService: один с 4 потоками, а другой - с 20 потоками. Я хочу, чтобы при нажатии кнопки Сервис 1 останавливался и дождался завершения службы 2. И после этого Service 1 продолжает работать.ExecutorService останавливается и ждет другого ExecutorService для завершения на Java

Я пытался сделать это с wait и notify, но он не работает, как ожидалось:

ExecutorService 1:

public void readFile(JTextArea textArea) { 
    try { 
     File file = new File(this.fm.fullPath); 
     if (!file.exists()) { 
      return; 
     } 
     BufferedReader br = new BufferedReader(new FileReader(this.fm.fullPath)); 

     ExecutorService executor = Executors.newFixedThreadPool(main.TOTALSTRINGS); 

     String line = br.readLine(); 

     int i=1; 
     while (line != null) { 
      powThread t = new powThread("Thread" + (i+1), line, textArea); 
      executor.execute(t); 
      line = br.readLine(); 
      i++; 
     } 

     executor.shutdown(); 
     Thread t = new Thread() { 
      public void run() { 
       try { 
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
        br.close(); 
       } catch (Exception e) { 

       } 
      } 
     }; 
     t.start(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

ExecutorService2:

public void generateNumStrings(JTextArea textArea) { 
    StringGenerator sg = new StringGenerator(); 

    int[] dynamicThreads = main.calcThreadsTotal(); 
    int totalThreads = dynamicThreads.length; 

    ExecutorService executor = Executors.newFixedThreadPool(totalThreads); 

    for(int i=0; i<totalThreads; i++) { 
     generateThread t = new generateThread("Thread" + (i+1), sg, dynamicThreads[i], this.fm); 
     executor.execute(t); 
    } 

    executor.shutdown(); 

    Thread t = new Thread() { 
     public void run() { 
      try { 
       textArea.setText(""); 
       executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
       textArea.append("File write successfully!"); 
      } catch (InterruptedException e) { 

      } 
     } 
    }; 
    t.start(); 
} 

ответ

2

Вы можете использовать в в AtomicReference сначала ExecutorService для обертывания второго ExecutorService или null, если второй ExecutorService не был создан, затем awaitTermination, если ссылка не является нулевой. Я предполагаю, что readFile и generateNumStrings находятся в том же классе, если нет, то вам нужно найти способ, чтобы сделать AtomicReference видна generateNumStrings

private final AtomicReference<ExecutorService> ref = new AtomicReference<>(null); 

private void awaitTermination() throws InterruptedException { 
    ExecutorService executor = ref.get(); 
    if(executor != null) { 
     executor.awaitTermination(1, TimeUnit.DAYS); 
    } 
} 

public void readFile(JTextArea textArea) { 
... 
    while (line != null) { 
     awaitTermination(); 
     powThread t = new powThread("Thread" + (i+1), line, textArea); 
     executor.execute(t); 
     line = br.readLine(); 
     i++; 
    } 
... 
} 

public void generateNumStrings(JTextArea textArea) { 
... 
    ExecutorService executor = Executors.newFixedThreadPool(totalThreads); 
    ref.set(executor); 
... 
} 
+0

Приятный и интересный. –

Смежные вопросы