标签:event-listener multithreading concurrency swing java
我有一个MouseListener线程,每次单击时都会调用此方法:
public void mousePressed(MouseEvent event){
//my Logic here
}
现在发生的事情是,在很短的时间内有如此多的点击,而我的逻辑在这里需要更多的时间来处理.我期望的是,将不再有更多点击,而这种方法将在最近的最新点击中继续使用.
但是发生的事情是,在逻辑处理过程中,传入的clice排队,甚至在单击停止时,队列单击也继续调用此mousePressed方法,结果我执行了多个延迟执行.
不幸的是,我无法控制侦听器(为什么查询并不断发送延迟的点击),所以在这种情况下,您能告诉我什么有效的处理方式,这样由于我的延迟而无法查询处理.
我认为最明显的方法是使用另一个线程,但是我想知道这可能会在很短的时间内触发这么多线程,或者有什么方法可以让我只锁定一个线程,而其余的点击只是通过空循环?
解决方法:
一种解决方案是访问用户单击的组件,并在处理MouseListener的过程中将其禁用.这样,它不接受新的点击.这将带来额外的好处,即为用户提供视觉反馈,使他此时不应该单击该组件.
您可以通过MouseEvent访问组件:
public void mousePressed(MouseEvent event) {
event.getComponent().setEnabled(false);
try {
// ....
} finally {
event.getComponent().setEnabled(true);
}
通常,尽管您不应该在Swing事件侦听器线程中进行过多的计算,因为Swing还需要它来处理其他事件和绘画.您应该使用单独的线程来进行实际工作,并仅在MouseListener中启动它们.您还可以使用ExecutorService简化此过程.
在整个计算过程中禁用gui组件仍然是一个好主意,以便为用户提供反馈.
编辑:
当然,此解决方案取决于Swing.任何类似的解决方案都取决于您的GUI库的详细信息,因此,如果您使用自己的GUI库,那么您就是您自己的GUI库.
当然,您可以使用涉及单独线程的常规解决方案来完成工作.我真的建议在这里使用ExecutorService,因为您不需要关心细节,只需提交要执行的任务即可.然后,您可以使用一个简单的volatile布尔变量,该变量指示当前是否正在执行该操作以及应该忽略新的点击.
标签:event-listener,multithreading,concurrency,swing,java 来源: https://codeday.me/bug/20191201/2083754.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。