使用ScheduledExecutorService计划从生成的线程安排任务?

时间:2017-06-17 06:05:07

标签: java multithreading thread-safety timertask scheduledexecutorservice

我打算为我的java应用程序实现一个计时器服务。 核心结构是这样的。

在Base类中,我调用scheduleATassk()来启动第一个具有延迟设置的任务。当延迟结束时,它将调用onTimeUp()通知我,我们可以计算下一个警报持续时间。所以在onTimeUp()中,如果满足条件,我将使用新的持续时间调用scheduleATassk()并重复循环。

我的问题是: 第一个任务将由主线程调度(注意在Base类的构造函数(主线程)中,它调用scheduleATassk()以使警报运行)。但是,任何后续的scheduleATassk()都将由子线程调用。有什么影响吗?安全吗?我可以改进设计吗?

public class Base {

    private ScheduledExecutorService service = null;

    public Base() {
         service = Executors.newSingleThreadScheduledExecutor();
         scheduleATassk(10);
    }

    public void onTimeUp() throws Exception {
        if (hasMoreTime) {
            scheduleATassk(newCalculatedDuration);
       } else {
          System.out.println("TIMER IS UP");
       }
    }

    protected void scheduleATassk(long duration) {
            service.schedule(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                             onTimeUp();
                        }
                    }, duration, TimeUnit.MILLISECONDS);}
    }
}

0 个答案:

没有答案