2016-07-05 2 views
-1

Ich habe Probleme in Multithreads Umgebung. Ich kann mehrere Threads erstellen, die korrekt ausgeführt werden, aber der Prozess endet nie. Ich kann nicht auf den Abschluss warten. Ich möchte etwas tun, wenn alle meine Threads enden, aber derzeit ist es unmöglich. Hier mein Code:Ich kann nicht warten, meine Threads in 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(); 
      } 
     } 
} 

Jemand weiß, wie man mein Ziel erreicht? Vielen Dank!

+1

Wo Sie 'notify()' nennen? – Kayaman

+0

Warum erstellen Sie einen neuen Thread-Pool innerhalb eines Threads? Sie haben bereits einen Thread zum Ausführen. –

+1

Siehe auch http://StackOverflow.com/questions/1250643/how-to-wait-for-all-threads-to-finish-using-executorservice. –

Antwort

2

kein Gewinde und eine ExecutorService erstellen Sie. Das ist überflüssig.

Momentan wird Ihr Programm nicht beendet, da der Hauptthread wait() aufgerufen wird, aber kein anderer Thread ruft notify().

Wenn Sie der Haupt-Thread zu warten, bis alle Aufgaben fertig ist, so etwas wie tun:

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

Try this:

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(); 
    } 
    } 
} 
Verwandte Themen