代号One和Java同步关键字

时间:2018-10-01 13:37:50

标签: codenameone

我怀疑我的一个Codename One项目中的错误是由同一个侦听器的并发执行引起的(如果用户多次快速点击按钮,并在结束执行之前调用其侦听器) ...我在代码中添加了一个锁变量,以避免同时执行多个操作,从而解决了该错误。

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

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

2 个答案:

答案 0 :(得分:2)

synchronized在Codename One中可以正常工作,但是如果您使用动作监听器,除非我们遇到一个巨大无法想象的错误,否则它不可能解决问题。

所有事件,绘制,生命周期方法等都在EDT上调用。这是一个单线程,因此在单个线程上单击两次按钮即可。 isEDT()将毫无意义。从触摸屏交互一直到组件本身的事件一直使用EDT,您可以通过invokeAndBlock方法进行测试。

更可能的情况是,按钮上的操作侦听器之一使用invokeAndBlock(),这可能会触发事件分发链中的怪异副作用。 AndWait方法,对话框等在内部使用{{1}}。

答案 1 :(得分:-1)

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

在处理这种情况时,您可能希望通过在首次单击后的一段时间内(或在结果计算的整个过程中)禁止用户交互,通过禁用并重新启用按钮来消除按钮的点击 >