timertask完成后,主线程中的调用方法

时间:2019-06-20 12:03:33

标签: java multithreading timertask

我已经通过TimerTask设置了initializeTimerTask(),它在指定的时间间隔后运行。
任务完成后,我想在主线程中调用一个方法。我该如何实现?我想让主线程wait()无法正常工作是因为该任务正在重复发生,并且初始化方法只调用了一次?

这是我的代码:

    public void initializeTimerTask() {
        Timer t = new Timer();
        TrackingTask tracker = new TrackingTask();
        t.scheduleAtFixedRate(tracker, 0, interval);    
    }



    class TrackingTask extends TimerTask {

        @Override
        public void run() {
            try {
                doMyTracking();

                // TODO: Notify main thread to do some work
            } 
        }
    }

1 个答案:

答案 0 :(得分:0)

使用Blocking Queue

TrackingTask.run()方法的末尾,将包含“必须在主线程中完成的某些工作”的Runnable添加到队列中。

在您的main方法中,一种可能性是进行无限循环并调用队列的take()方法并运行该队列以接任务(或等到有一个任务)并运行它。

在main方法中,例如:

public static final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();

public static void main(String[] args) throws InterruptedException {

    yourClassInstance.initializeTimerTask();

    while(true) {
        queue.take().run();
    }

}

在您的TrackingTask类中:

class TrackingTask extends TimerTask {

    @Override
    public void run() {

       doMyTracking();
       queue.add(() -> {
            // Here the stuff that needs to be done in the main thread.
            // The Runnable is added to the queue and then taken and executed in main()
       });
    }   
}