java - 有效实现此 Java MouseListener 逻辑

标签 java multithreading swing concurrency event-listener

我有一个 MouseListener 线程,每次点击时都会调用此方法:

public void mousePressed(MouseEvent event){

    //my Logic here

}

现在发生的情况是在很短的时间内有很多点击,而我这里的逻辑需要更多的时间来处理。我所期待的是,进一步的点击将被丢弃,这种方法将在最近的即将到来的点击中继续。

但是发生了什么,当逻辑正在处理时,传入的点击被排队,甚至当点击停止时,排队的点击继续调用这个 mousePressed 方法,结果我有多个延迟执行。

不幸的是,我无法控制监听器(为什么它会发送延迟点击),所以在这种情况下,你能告诉我什么是有效的处理方式,这样我就不会因为延迟我的处理。

我认为最明显的方法是使用另一个线程,但我想知道这可能会在短时间内触发这么多线程,或者有什么方法可以只锁定一个线程,而其余的点击只是通过空循环?

最佳答案

更新:请参阅 Phillip 的评论,了解为什么这对 Swing 不起作用!

很遗憾,您无权访问 eventListener。理想的解决方案是在执行回调时注销回调。

这是一个解决方案,它模拟在回调函数执行时取消注册,假设您希望排队的点击消失:

private AtomicBoolean engaged = new AtomicBoolean(); // thread-safe boolean

public void mousePressed(MouseEvent event){
    if (!engaged.get()) {
        engaged.set(true);

        // your logic here

        engaged.set(false);
    }
}

AtomicBoolean充当测试和设置锁,防止多个线程同时运行按下的事件回调。排队的打印机将在锁定期间消散。

关于java - 有效实现此 Java MouseListener 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8981124/

相关文章:

java - 在 Java EE 环境中暂停/ sleep n 秒

GUI 中的 Java bean 绑定(bind)

java - Java 中简单的横向卷轴游戏出现滞后

java - GridLayout 中的 JLabel 并不总是被绘制

java - 将 @Id Marshall 转换为 JSON,同时保留 Java 8 时间格式

java - Shiro Authorization 使用远程角色填充授权

python - 带池的 SQLAlchemy 不关闭数据库连接

java - 让多个 Java pop3 客户端与 GMail 一起使用

java - mongo-java 3 中自动获取 DBRef

java - Jackson - 在序列化为 json 期间将空集合视为 null