我有一个预期任务,应该每 10 秒执行一次。它在我刚运行项目时起作用,意思是,它会运行()一次,但不会在随后的时间运行。有人能告诉我哪一部分是错的吗..我花了几个小时试图解决这个问题但无济于事:( 这是我的主要内容:
public static void main(String[] args) {
launch(TestingApp.class, args);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new Cost(), 10*1000, 10*1000);}
这是费用代码:
public class Cost extends TimerTask {
public void run() {
Calendar rightNow = Calendar.getInstance();
Integer hour = rightNow.get(Calendar.HOUR_OF_DAY);
if (hour == 3) {
try {
File file = new File("D:/TESTAPP/Testing.csv");
if (file != null) {
Opencsv csv = new Opencsv();
csv.Csvreader();
}
} catch (IOException ex) {
Logger.getLogger(Cost.class.getName()).log(Level.SEVERE, null, ex);
}
}
else {
}
}
}
我试过的一些方法是结束一个 thread.sleep 到 Cost 代码的末尾,我试过的另一种方法是添加了一段时间(真)我的主要...
最佳答案
我怀疑是这样的:
Opencsv csv = new Opencsv();
csv.Csvreader();
正在阻塞计时器的线程。您是否尝试过在后台线程中执行此操作?
例如,您的代码等同于:
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("here");
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {}
}
}, 1000, 1000);
}
}
我建议您改为在后台线程中执行内部操作,以免减慢 Timer 的速度。注意不同的执行时间:
import java.util.Timer;
import java.util.TimerTask;
public class TestTimer {
public static void main(String[] args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
new Thread(new Runnable() {
public void run() {
System.out.println("here");
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {}
}
}).start();
}
}, 1000, 1000);
}
}
编辑2
同样,您的问题有一个“swing”标签,表明您的问题涉及属于 Swing GUI 一部分的代码。如果是这样,那么建议可能需要有所不同,尤其是当您的任何代码需要在 Swing 事件线程上调用时。
关于java - 定时器重复执行只执行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8856597/