带线程的 Java 定时器

标签 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
    }
};
}

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

最佳答案

问题不在于使用 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.

关于带线程的 Java 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5787567/

相关文章:

java - 多线程不比单线程快(简单循环测试)

ios - objective-c 线程 1 信号 SIGSTOP 应用程序崩溃

c++ - 访问 QTimer 的经过秒数?

vbscript - 如何制作 VBScript 定时器

java - 打开图像文件 - BLACKBERRY/J2ME

java - 使用 Websphere 共享库时 Hibernate java.lang.ClassCastException : _$$_javassist_856 cannot be cast to javassist. util.proxy.Proxy

java - 使用java从oracle获取最新日期

java - Web 驱动程序的依赖问题 - 无法从最终类继承

java - 在一个循环中批量插入到不同的表

android - 使用 Android 闹钟与计时器任务?