Java使用来自任务本身的数据终止时间任务

时间:2017-06-01 01:56:09

标签: java timer timertask

我已经掌握了Timer和TimerTask如何在Java中工作的基础知识。我有一种情况,我需要生成一个任务,该任务将以固定的时间间隔定期运行,以从数据库中检索一些数据。它需要根据检索到的数据的值终止(数据本身正由其他进程更新)

这是我到目前为止所提出的。

public class MyTimerTask extends TimerTask {

    private int count = 0;
    @Override
    public void run() {
        count++;
        System.out.println(" Print a line" + new java.util.Date() + count);
    }

    public int getCount() {
        return count;
    }
}

一个类似主要方法的类。现在,我通常使用15秒的睡眠来控制timerTask的运行时间。

public class ClassWithMain {
public static void main(String[] args) {
    System.out.println("Main started at " + new java.util.Date());
    MyTimerTask timerTask = new MyTimerTask();
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(timerTask, 0, 5*10*100);

    try {
        Thread.sleep(15000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Main done"+ new java.util.Date());

}

MyTimerTask类在数据库服务调用等方面会变得更加复杂。

我希望能够做的是,在主类中,查询timerTask返回的值,以指示何时调用timer.cancel()并终止进程。现在,如果我尝试使用MyTimerTask的count属性,它就不起作用了。所以当我尝试在ClassWithMain

中添加这些行时
if (timerTask.getCount() == 5){
    timer.cancel();
}

它没有停止这个过程。

所以我喜欢任何方向,如何能够完成我想要做的事情。

1 个答案:

答案 0 :(得分:1)

private volatile int count = 0;最好使用' volatile'。
在ClassWithMain中尝试这个:

for(;;) {
  if (timerTask.getCount() == 5) {
    timer.cancel();
    break;
  } else{
    Thread.yield();
  }
}