什么 Lock 不是可重入的,即如果在同一线程中获取而没有事先释放的块



当我单击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 控件从来都不是一件好事......

最新更新