Используйте Очередь блокировки .
. В конце метода 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()
});
}
}