【发布时间】:2012-01-24 01:45:31
【问题描述】:
我有一个 MouseListener 线程,每次点击时都会调用这个方法:
public void mousePressed(MouseEvent event){
//my Logic here
}
现在发生的情况是,在很短的时间内就有如此多的点击,而我这里的逻辑需要更多时间来处理。我所期望的是,进一步的点击将被丢弃,并且此方法将在最新的即将点击中继续。
但是发生了什么,当逻辑正在处理时,传入的 clics 排队,即使点击停止,qued 点击继续调用这个 mousePressed 方法,结果我有多个延迟执行。
不幸的是,我无法控制侦听器(为什么它会查询并继续发送延迟的点击),所以在这种情况下,你能告诉我什么是有效的处理方式,这样我就不会因为我的处理延迟。
我认为最明显的方法是使用另一个线程,但我想知道这可能会在短时间内触发这么多线程,或者有什么方法可以锁定一个线程,而其余的点击只是通过空循环?
【问题讨论】:
-
您可能想要模拟 Swing 如何处理重绘请求——当它们堆积起来时它会忽略请求。请在此处查看更多信息:Painting in AWT and Swing。是的,我认为无论如何,您都希望使用后台线程,可能是线程池。
-
@HovercraftFullOfEels,这是 JNI 方法,其中实际的鼠标侦听器来自本机代码,不涉及 Swing。
-
好的,所以如果我只是启动一个新线程然后调用该方法,至少我不会错过任何点击,尽管结果仍然延迟并且在许多并行线程中,我想使用一些 volatile布尔标志可能是答案,我想是的。
-
这是否是 Swing 无关紧要,因为原理是相同的。
-
请注意,问题的第一行是错误的,MouseListener 不是 Thread。它只是给 Swing 并由 Swing 执行的某种回调对象(碰巧在主线程之外的另一个线程上执行它,但这不会使 MouseListener 本身成为一个线程)。
标签: java multithreading swing concurrency event-listener