在Java中定时器ActionListener操作

Ben*_*Ben 4 java swing timer actionlistener

我对java比较陌生,对ActionListeners的工作方式很好奇.假设我有一个实现如下定时器的动作监听器:

class TimerActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //perform some operation
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hov*_*els 8

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

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

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

  • 参见[`setCoalesce()`](http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html#setCoalesce%28boolean%29). (7认同)