【问题标题】:Call method in main thread after timertask completestimertask完成后在主线程中调用方法
【发布时间】:2019-06-20 12:03:33
【问题描述】:

我通过initializeTimerTask() 设置了一个TimerTask,它在指定的时间间隔后运行。
任务完成后,我想在我的主线程中调用一个方法。我怎样才能做到这一点?我猜让我的主线程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
            } 
        }
    }

【问题讨论】:

    标签: java multithreading timertask


    【解决方案1】:

    使用Blocking Queue

    TrackingTask.run()方法的最后,添加一个Runnable,里面包含“一些必须在主线程中完成的工作”到Queue中。

    在您的 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()
           });
        }   
    }
    

    【讨论】:

    • 不幸的是,这导致我的主线程除了等待队列之外什么都不做......但它应该能够同时做其他事情,例如当跟踪间隔设置为 10 分钟时。
    • TrackingTask 执行后,是否需要在主线程中精确执行“东西”?然后你可以启动一个新的可运行而不是队列。
    • 您是否在 TrackingTask 完成后更新某种 GUI,因此您必须在主 (UI) 线程上执行它?
    • 不,我没有 GUI。只是认为如果我返回主线程会“更干净”......但我想它也适用于新的 Runnable。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多