2016-07-05 48 views
-1

我在mulithreads環境中有問題。我可以創建幾個正確執行的線程,但是這個過程永遠不會結束。我不能等待整理。 我想在所有線程結束但是目前不可能的情況下執行一些操作。這裏我的代碼:我不能等我的線程在java

public static void main(String[] args){ 

public void run(){ 
      ExecutorService exec = Executors.newFixedThreadPool(10); 
    try { 
       for(int i=0;i<100;i++){ 
        final Integer a=i; 
        try { 
         exec.submit(new Runnable() { 
         @Override 
          public void run() { 

         System.out.println(a); 
         } 
        }); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
} 

有人知道如何實現我的目標?謝謝!

+1

你在哪裏調用'通知()'? – Kayaman

+0

爲什麼在線程中創建一個新的線程池?你已經有了一個線程來執行。 –

+1

也看看http://stackoverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice。 –

回答

2

不要創建一個線程和ExecutorService。這是多餘的。

目前,您的程序不會退出,因爲主線程調用wait(),但沒有其他線程調用notify()

如果你想在主線程等待,直到所有的任務完成,做這樣的事情:

final class EjecutorUpdateContactos { 
    void update() throws Exception { 
    ExecutorService workers = Executors.newFixedThreadPool(10); 
    List<Callable<Void>> tasks = new ArrayList<>(); 
    for(int i = 0; i < 100; i++) { 
     int a = i; 
     tasks.add(new Callable<Void>() { 
     @Override 
     public Void call() { 
      System.out.println(a); 
      return null; 
     } 
     }); 
    } 
    workers.invokeAll(tasks); 
    workers.shutdown(); 
    } 
} 
-2

試試這個:

public class EjecutorUpdateContactos extends Thread { 

    @Override 
    public void run() { 
     ExecutorService exec = Executors.newFixedThreadPool(10); 
     try { 
       for (int i = 0; i < 100; i++) { 
       final Integer a = i; 
       try { 
        exec.submit(new Runnable() { 
         @Override 
        public void run() { 

         System.out.println(a); 
        } 
       }); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     notify(); 
    } 
    } 
}