2017-02-20 35 views
0

Я пытаюсь запустить несколько служб параллельно с помощью ExecutorService. Но я не смог выполнить параллель.Служба Java-исполнителя не обрабатывается Parallely

Я написал java.util.concurrent.TimeUnit.MINUTES.sleep (1) подождать одну минуту в классе Service1.

Но Service2 обрабатывается только после обработки Service1.

Ниже мой фрагмент кода, Пожалуйста, поправьте меня/код, если мой понять о ExecutorService неправильно

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

это работает для меня –

+0

точнее, Service1 начинается до Service2, но заканчивается после –

+0

Извините, когда я ставлю глобальный sop {}. Не работает – DEADEND

ответ

2

Код:

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

является конструктором, и его называют главным нить, когда он делает новый Service1(). Так что да, он должен закончить, прежде чем у него появится возможность отправить свои услуги.

UPDATE:

В исходном сообщении, сон был в методе вызова, и он работал. Теперь ваша Служба 1 эквивалентна:

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; 
    } 
} 

И только метод вызова выполняется исполнителем. экземпляр Service1 не может быть отправлен до завершения конструктора.

+0

Извините Морис. Я новая тема, не могли бы вы рассказать, если вы не возражаете. – DEADEND

+0

Вы говорите, что Service2 будет вызываться только после завершения инициализации Service1? – DEADEND

+0

@Siva посмотреть мое обновление –

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

  • Нет связанных вопросов^_^