带有线程的Java Timer

时间:2011-04-26 08:07:03

标签: java multithreading timer

我开发了一个简单的应用程序并使用了计时器,但是如果我多次运行计时器,则计时器会丢弃此异常:线程中的异常“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
    }
};
}

我的问题是我在哪里使用线程?谢谢!

3 个答案:

答案 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在取消后再安排任务?