当我在主线程中单击Button1
我想要tryLock()
然后启动后台任务时。后台任务将在完成后将unlock()
发布到主线程。如果未获取锁定,则单击应该不执行任何操作并返回。我不想在后台任务的线程中锁定,因为初始化任务对象很昂贵。如果已经通过上一次按钮点击获取了锁,我想完全避免创建一个任务对象。
如果Button2
的任务尚未完成,tryLock()
和Button1
应该会失败。由于两个按钮都从同一个线程锁定,因此重入锁定不起作用。
由于只能从主线程获取和释放锁定,解决方案只是一个private boolean
类成员吗?它甚至必须是volatile
吗?
答案 0 :(得分:2)
如果阻止GUI线程,则无法点击任何内容。不要使用锁。
简单明了boolean
就可以了。
您需要做的就是将boolean
设置为false
,调用SwingWorker
,然后在true
方法中将其重置为done
。由于在EDT上调用done
方法,您将从EDT启动SwingWorker
,因此没有线程要求。
在您说后台任务将发布unlock()
的问题中,根据其工作原理,您可能需要使用volatile boolean
。
如果您想要从后端分离前端,最好使用类似Model View Presenter模式的内容,并在演示者myControlsEnabled(boolean enabled)
中使用interface
方法。用户启用不执行任何操作的GUI控件永远不会很好......