Вызов метода в главном потоке после завершения таймерной задачи - PullRequest
1 голос
/ 20 июня 2019

Я установил 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 голосов
/ 20 июня 2019

Используйте Очередь блокировки .

. В конце метода TrackingTask.run() добавьте Runnable, который содержит «некоторую работу, которая должна быть выполнена в главном потоке» вочередь.

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

В основном методе, например, вот так:

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()
       });
    }   
}
...