【问题标题】:java.util.concurrent.ScheduledExecutorService: is it possible to wait for a service to finish before starting another one?java.util.concurrent.ScheduledExecutorService:是否可以在启动另一个服务之前等待服务完成?
【发布时间】:2018-05-28 07:19:41
【问题描述】:

我在 web.xml 中设置了 2 个服务,并为每个服务创建了一个 shedule 服务,如下所示:

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

我想运行第一个服务来启动我的应用程序,等待该服务完成,然后运行第二个服务。可以吗?

【问题讨论】:

  • 是的,你可以做到。如果您的第一个服务完成,请保留一个布尔标志并返回 true。然后在 run 方法中调用第二个服务之前检查该标志。
  • 好的,我曾考虑过这个解决方案,但我相信 ScheduledExecutorService 类有一些特性可以实现这一点。非常感谢

标签: java timer scheduledexecutorservice


【解决方案1】:

如果您想使用更具体的内容 - 例如,您可以使用 CountDownLatch。创建

CountDownLatch latch = new CoundownLatch(1); 

第一个服务将在完成工作后致电countDown()

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

第二个服务会等到闩锁计数器不等于 0。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多