2017-02-20 3 views
0

ich mehrere Dienste parallel mit ExecutorService zu laufen bin versucht. Aber ich konnte nicht parallel ausführen.Java Executor Dienst verarbeitet Nicht Parallel

Ich habe java.util.concurrent.TimeUnit.MINUTES.sleep (1) geschrieben, um eine Minute in Service1-Klasse zu warten.

Aber Service2 verarbeitet erst nach Dienste1 verarbeitet.

Unten ist mein Code-Schnipsel, korrigieren Sie mich bitte/code, wenn meine über ExecutorService verstehen

public void startService() { 

    try { 
     ExecutorService service = Executors.newFixedThreadPool(3); 
     service.submit(new Service1()); 
     service.submit(new Service2()); 
     service.submit(new Service3()); 

     service.shutdown(); 
     service.awaitTermination(1, TimeUnit.MINUTES); 

     System.exit(0); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public class Service1 implements Callable<Object> { 

    { 
     try { 
      java.util.concurrent.TimeUnit.MINUTES.sleep(1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public Object call() throws Exception { 
     return null; 
    } 
} 

public class Service2 implements Callable<Object> { 

    @Override 
    public Object call() throws Exception { 
     System.out.println(" Service 2 "); // It prints after 1 minute only. 
     return null; 
    } 
} 

public class Service3 implements Callable<Object> { 

    @Override 
    public Object call() throws Exception { 
     System.out.println(" Service 3 "); 
     return null; 
    } 
} 
+0

es funktioniert für mich –

+0

genauer gesagt, Service1 startet vor Service2, aber endet nach –

+0

Sorry, wenn ich als globale SOP {}. Es funktioniert nicht – DEADEND

Antwort

2

Der Code falsch ist:

{ 
    try { 
     java.util.concurrent.TimeUnit.MINUTES.sleep(1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

ist ein Konstruktor, und es wird von dem Haupt genannt wird thread, wenn es neue Service1() macht. Also ja, es muss abgeschlossen sein, bevor es eine Chance hat, die Dienste einzureichen.

UPDATE:

In Ihrer ursprünglichen Post, war der Schlaf in der Call-Methode, und es funktionierte. Nun entspricht Ihr Service1:

public class Service1 implements Callable<Object> { 

    public Service1() { 
     try { 
      java.util.concurrent.TimeUnit.MINUTES.sleep(1); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public Object call() throws Exception { 
     return null; 
    } 
} 

Und nur die Aufrufmethode wird vom Executor ausgeführt. Die Service1-Instanz kann nicht einmal gesendet werden, bevor der Konstruktor abgeschlossen ist.

+0

Sorry Maurice. Ich bin ein neuer Thread, kannst du bitte weiterarbeiten, wenn es dir nichts ausmacht. – DEADEND

+0

Sie sagen, dass Service2 nur aufrufen wird, nachdem die Initialisierung von Service1 abgeschlossen ist, oder? – DEADEND

+0

@Siva siehe mein Update –

Verwandte Themen