Codenameone 代码名1和Java synchronized关键字

Codenameone 代码名1和Java synchronized关键字,codenameone,Codenameone,我怀疑我的一个代号为one的项目中的一个bug是由同一个侦听器的并发执行引起的(如果用户更快地点击按钮多次,在结束执行之前调用其侦听器)。。。我在代码中添加了一个lock变量,以避免同时执行多次,这就解决了这个bug 这是我第一次遇到这种问题。在网上阅读时,建议使用synchronizedJava关键字(但是我不确定它在这种情况下是否有用) 我的问题是,Codename One是否支持synchronizedJava关键字 使用syncronized将阻止方法的并发执行,但实际上会通过强制线程等

我怀疑我的一个代号为one的项目中的一个bug是由同一个侦听器的并发执行引起的(如果用户更快地点击按钮多次,在结束执行之前调用其侦听器)。。。我在代码中添加了一个lock变量,以避免同时执行多次,这就解决了这个bug

这是我第一次遇到这种问题。在网上阅读时,建议使用
synchronized
Java关键字(但是我不确定它在这种情况下是否有用)


我的问题是,Codename One是否支持
synchronized
Java关键字

使用
syncronized
将阻止方法的并发执行,但实际上会通过强制线程等待任何当前执行来排队请求


在处理此场景时,您可能希望在首次按下按钮后的一段时间内,或在计算结果的持续时间内,阻止用户交互,从而消除按钮单击的影响,通过禁用按钮并重新启用它

synchronized
可以在Codename One中正常工作,但如果使用动作侦听器,则不太可能解决问题,除非我们有一个无法想象的巨大bug

在EDT上调用所有事件、绘制、生命周期方法等。这是一个单线程,所以在一个线程上点击两次按钮就会发生<代码>同步将毫无意义。EDT从触摸屏交互一直使用到组件本身上的事件,您可以通过
isEDT()
方法进行测试


更可能的情况是,按钮上的一个操作侦听器使用
invokeAndBlock
,这会在事件调度链中触发奇怪的副作用
invokeAndBlock()
和Wait
方法、对话框等内部使用。

非常感谢您提供了有趣且清晰的答案。我很困惑,因为我认为ActionListener的执行在一个单独的线程中。也许我找到了错误的真正原因:使用
animateUnlayout
(立即返回,允许同一个侦听器的另一个执行开始,而不等待动画结束),而不是
animateUnlayout和wait
(在动画结束之前阻止另一个侦听器执行)。在
animateUnlayout
的情况下,动画是在EDT内部还是外部执行的?我这样问是因为它会立即返回。两个动画在EDT上都100%执行。动画只是打开一个“标志”,使动画为每个EDT循环运行(也称为勾号)。
AndWait
方法使用
invokeAndBlock
打开一个只等待(不做任何其他事情)的线程<代码>调用Kekand Bugs/Cudio>获取EDT并保持它运行,但这些行在没有发生之后立即执行,因为它们已经在执行的中间。因此,一旦
invokeAndBlock
完成下一行(以及链中的下一个事件),就可以执行。if按钮有3个侦听器,侦听器2有10行。第5行使用
和等待
方法。第5行之后的所有行都不会执行,侦听器3也不会执行。一旦
和wait
结束了剩下的几行,listener 3将被调用谢谢你的回答,但是我否决了它,因为它是一个一般性的回答,不以Codename One为目标,可能会让人困惑。