在Java中定时器ActionListener操作

时间:2011-10-18 22:25:37

标签: java swing timer actionlistener

我对java比较陌生,并对ActionListeners的工作原理感到好奇。假设我有一个按如下方式实现的计时器的动作监听器:

class TimerActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //perform some operation
    }
}

如果计时器设置为运行得比我的actionlistener类中的代码可以执行的速度快,会发生什么。代码是否完成执行并忽略新请求,直到完成(如中断)。或者对actionlistener的新调用优先于当前实例 - 这样代码永远不会完成?

3 个答案:

答案 0 :(得分:8)

计时器的计时是在与事件派发线程(或EDT)不同的线程中完成的,事件派发线程是在ActionListener中运行代码的线程。因此,即使actionPerformed代码很慢,计时器也将继续触发,并将其actionPerformed代码排队到事件队列上,这可能会被备份,事件线程将被阻塞,应用程序将无法响应或响应不佳。 / p>

回避点是避免调用任何在事件线程上花费一些时间的代码,因为它会使GUI无响应。考虑使用SwingWorker来处理这种情况。

编辑:请参阅下面的trashgod评论获胜!

答案 1 :(得分:3)

基于来自气垫船和trashgod的帖子,似乎Timer事件不按其默认设置排队。 (即,在计时器事件处理程序代码完成执行之前,将忽略新的计时器事件。)

答案 2 :(得分:2)

您可以自行测试,如下所示:

class TimerActionListener implements ActionListener {
    public static int inst = 1;
    public void actionPerformed(ActionEvent e) {
        int id = inst++;
        System.out.println("Executing instance: " + id);
        try { Thread.sleep(3000); } catch (Exception e) {} //For sleep 3 seconds
        System.out.println("Instance: " + id + "done! ");
    }
}