java.util.concurrent.ScheduledExecutorService: возможно ли дождаться завершения службы, прежде чем запускать другую? - PullRequest
0 голосов
/ 28 мая 2018

Я установил 2 службы в своем файле web.xml и создаю для каждого из них службу расписания следующим образом:

public class MyScheduler implements ServletContextListener {

    private ScheduledExecutorService scheduledExecutorService = null;

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        if ((scheduledExecutorService == null) || (!scheduledExecutorService.isTerminated())) {
            scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
            scheduledExecutorService.scheduleAtFixedRate(new MyScheduledTimer(), 0, 15, TimeUnit.DAYS);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        try {
            scheduledExecutorService.shutdown();
        } catch (Exception ex) {
        }
    }
}

class MyScheduledTimer extends TimerTask {

    {
        try {
            MyEjb ejbObject = (InterfaceEjb) new InitialContext().lookup("java:global/project/MyEjb");

        } catch (NamingException ex) {
            Logger.getLogger(MyScheduler.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(MyScheduler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run() {
        //my code to run with ejbObject...
    }
}

Я хотел бы запустить первую службу для запуска приложения, ожидая, что эта служба будет завершенаи после запуска второй сервис.Возможно ли это?

1 Ответ

0 голосов
/ 28 мая 2018

Если вы хотите использовать что-то более конкретное - вы можете использовать CountDownLatch, например.Создать

CountDownLatch latch = new CoundownLatch(1); 

Первый сервис позвонит countDown(), когда закончит свою работу.

//service1
public void run(){
    doSmthng();
    latch.countDown();
}

И второй сервис будет ждать, пока счетчик защелок не будет равен 0.

//service2
public void run(){
    latch.await();
    doSmthngElse();
}
...