当我单击Button1
时,我想在主线程中tryLock()
,然后启动后台任务。后台任务完成后会将unlock()
发布到主线程。如果未获取锁,则单击不应执行任何操作,只需返回。我不想从后台任务的线程中锁定,因为初始化任务对象很昂贵。如果锁已经通过先前的按钮单击获得,我想完全避免创建任务对象。
同样的事情应该发生在Button2
,如果Button1
的任务没有完成,tryLock()
应该失败。可重入锁在这里不起作用,因为两个按钮都从同一线程锁定。
由于锁只会从主线程中获取和释放,因此解决方案是否只是一个private boolean
类成员?甚至必须volatile
吗?
如果您阻止 GUI 线程,则没有任何机会单击任何内容。不要使用锁。
只需一个简单明了的boolean
就可以很好地解决问题。
您需要做的就是将boolean
设置为 false
,调用SwingWorker
,然后在 done
方法中将其重置为 true
。由于 done
方法在 EDT 上调用,并且您将从 EDT 启动SwingWorker
,因此没有线程要求。
在问题中,您说后台任务将发布unlock()
,具体取决于其工作方式,您可能需要使用volatile boolean
。
如果要将前端与后端分离,最好使用类似模型视图表示器模式的东西,并在表示器interface
中使用myControlsEnabled(boolean enabled)
方法。对于用户来说,启用什么都不做的 GUI 控件从来都不是一件好事......