Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java timertask完成后在主线程中调用方法_Java_Multithreading_Timertask - Fatal编程技术网

Java timertask完成后在主线程中调用方法

Java timertask完成后在主线程中调用方法,java,multithreading,timertask,Java,Multithreading,Timertask,我已通过initializeTimerTask()设置了一个TimerTask,该任务在指定的时间间隔后运行。 任务完成后,我想在主线程中调用一个方法。我怎样才能做到这一点?我想让我的主线程wait()无法工作,因为该任务正在重复,而初始化方法只调用了一次 这是我的密码: public void initializeTimerTask(){ 定时器t=新定时器(); TrackingTask tracker=新TrackingTask(); t、 scheduleAtFixedRate(跟踪器,

我已通过
initializeTimerTask()
设置了一个
TimerTask
,该任务在指定的时间间隔后运行。
任务完成后,我想在主线程中调用一个方法。我怎样才能做到这一点?我想让我的主线程
wait()
无法工作,因为该任务正在重复,而初始化方法只调用了一次

这是我的密码:

public void initializeTimerTask(){
定时器t=新定时器();
TrackingTask tracker=新TrackingTask();
t、 scheduleAtFixedRate(跟踪器,0,间隔);
}
类TrackingTask扩展了TimerTask{
@凌驾
公开募捐{
试一试{
doMyTracking();
//TODO:通知主线程执行一些工作
} 
}
}
使用

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

}

不幸的是,这导致我的主线程除了等待队列之外什么也不做。。。但它应该能够同时执行其他操作,例如,当跟踪间隔设置为10分钟时。在执行TrackingTask后,是否需要在主线程中精确执行“stuff”?然后您可以启动一个新的可运行而非队列。您是否在TrackingTask完成后更新某种GUI,因此您必须在主(UI)线程上执行它?不,我没有GUI。我只是觉得如果我回到主线程会更干净。。。但我想它也会与一个新的Runnable一起工作。谢谢不幸的是,这导致我的主线程除了等待队列之外什么也不做。。。但它应该能够同时执行其他操作,例如,当跟踪间隔设置为10分钟时。在执行TrackingTask后,是否需要在主线程中精确执行“stuff”?然后您可以启动一个新的可运行而非队列。您是否在TrackingTask完成后更新某种GUI,因此您必须在主(UI)线程上执行它?不,我没有GUI。我只是觉得如果我回到主线程会更干净。。。但我想它也会与一个新的Runnable一起工作。谢谢