我对java比较陌生,并对ActionListeners的工作原理感到好奇。假设我有一个按如下方式实现的计时器的动作监听器:
class TimerActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//perform some operation
}
}
如果计时器设置为运行得比我的actionlistener类中的代码可以执行的速度快,会发生什么。代码是否完成执行并忽略新请求,直到完成(如中断)。或者对actionlistener的新调用优先于当前实例 - 这样代码永远不会完成?
答案 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! ");
}
}