2017-02-21 4 views
2

Я пытаюсь написать службу службы демона в java. Эта услуга будет работать каждую минуту.Java ExecutorService Бесконечный цикл Работа

Но я не могу реализовать это с помощью ExecutorService, и я не знаю, правильно ли это. Ниже мой фрагмент кода:

public void startService() { 
    try { 
     ExecutorService service = Executors.newFixedThreadPool(3); 

     for (;;) { 
      service.submit(new Service1()); // this will send some set of emails 
      service.submit(new Service2()); // this will send some set of emails 
      service.submit(new Service3()); // this will send some set of sms 
     } 
     service.shutdown(); // It says Unreachable code so when should i shutdown the service 
     service.awaitTermination(1, TimeUnit.MINUTES); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

ответ

3

Ваш for loop не имеет окончание состояния: for(;;), и не о перерыве.

Так весь код после этот цикл, если конечно недостижим.


Вы должны подождать 1 минуту внутри цикла, а не после (как код после зацикливания никогда не будет запущен).

Поддержание synthax, я предполагаю, что это должно быть:

for (;;) { 
    service.submit(new Service1()); // this will send some set of emails 
    service.submit(new Service2()); // this will send some set of emails 
    service.submit(new Service3()); // this will send some set of sms 
    service.shutdown(); 
    service.awaitTermination(1, TimeUnit.MINUTES); 
} 
+0

Да, это не прекращение работы. он будет работать каждую минуту. Можете ли вы сказать, как достичь этого. – DEADEND

1

Это здесь:

for (;;) { 
     service.submit(new Service1()); // this will send some set of emails 
     service.submit(new Service2()); // this will send some set of emails 
     service.submit(new Service3()); // this will send some set of sms 
    } 

бесконечный цикл; он продолжает отправлять новые задания в ваш поток ... постоянно. Не один раз в минуту, но один раз за итерацию. У вас должно быть slow вниз по вашей петле!

Я не уверен, что вы просите, но вы должны либо просто удалить эту петлевую конструкцию; или, скорее всего, сделать что-то вроде:

while (true) { 
    service.submit(new Service1()); // this will send some set of emails 
    service.submit(new Service2()); // this will send some set of emails 
    service.submit(new Service3()); // this will send some set of sms 
    Thread.sleep(1 minute); 
} 

или что-то подобное.

+1

@GhostCat .. Если вы не понимаете мою проблему, оставьте ее. не продолжайте. – DEADEND

+4

@GhostCat: Независимо, вы могли бы закалить то, как вы это сказали. Мы здесь, чтобы помочь, а не бить людей палкой. Возможно, можно использовать другой подход. – Paul

4

Сначала вам нужно посмотреть ScheduledExecutorService и его реализации. Эта служба позволяет планировать выполнение заданий с заданной частотой. Это короткий ответ. Что касается деталей реализации, слишком много неизвестных, чтобы дать вам практические советы. Вы хотите, чтобы ваша программа запускалась в контейнере (веб-сервере или сервере приложений) или в автономном режиме с доменным потоком? вы работаете в Unix/Linux (так можно использовать планировщик заданий Cron) или Windows? Один из параметров планировщика может быть quartz-scheduler. Надеюсь, это поможет.

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