我开发了一个简单的应用程序并使用了计时器,但是如果我多次运行计时器,则计时器会丢弃此异常:线程中的异常“AWT-EventQueue-0”java.lang.IllegalStateException:计时器已被取消。 这是我的代码:
public class Main {
...
private static void createAndShowUI() {
...
//a listener of a radio button
ActionListener on_action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Timer.timer.schedule(Timer.task,0,2000); //I call the timer here
}
};
...
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
//and the class of timer:
public class Timer {
public static java.util.Timer timer = new java.util.Timer();
public static java.util.TimerTask task = new java.util.TimerTask() {
public void run() {
//some tasks
}
};
}
我的问题是我在哪里使用线程?谢谢!
答案 0 :(得分:1)
问题是没有使用Event-Queue线程,而是您正在重新使用已取消的Timer。
我猜你正在使用Timer来做一些动画或某些东西以响应按钮按下(当你以固定的速率安排事情时)。我猜也是在代码中你没有告诉我们,计时器会被一个单独的事件取消。如果你曾经调用Timer.cancel(),你能告诉我们那段代码吗?
从例外情况来看,您正在尝试使用已取消的相同计时器。 Once a Timer has been cancelled, it can't be used again.
两个建议 - 每次使用不同的计时器。此外,如果您正在为UI目的做事,您可能需要考虑using a Swing timer instead。
就线程而言,所有GUI事件都发生在AWT线程上,但我再说一遍,这几乎肯定不是问题所在。 Read this for more details.
答案 1 :(得分:1)
如果调用了cancel()
方法,或者计时器任务意外终止,则计时器进入取消状态:
如果计时器的任务执行线程意外终止,例如,因为调用了stop方法,则在计时器上计划任务的任何进一步尝试都将导致IllegalStateException,就好像调用了计时器的cancel方法一样。
所以在你的情况下,它可能不是你放置/调用/使用你的时间的问题,但更多的是你正在做什么的问题用你的计时器。
答案 2 :(得分:1)
这里有你的主题:
对应每个Timer对象是一个后台线程,用于执行所有计时器的任务,顺序
因此,如果您尝试从Timer任务访问GUI,则应将其放入EventQueue线程中。
看看这里
如果计时器的任务执行线程意外终止,例如,因为调用了stop方法,那么在计时器上安排任务的任何进一步尝试都将导致IllegalStateException,就像调用了计时器的cancel方法一样。
您是否让Timer在取消后再安排任务?