- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我单击Button1
时,我想在主线程中tryLock()
,然后启动后台任务。后台任务完成后会将 unlock()
发布到主线程。如果未获取锁定,则单击不应执行任何操作而只是返回。我不想从后台任务的线程中锁定,因为初始化任务对象的成本很高。如果先前的按钮单击已经获取了锁,我想避免完全创建任务对象。
同样的事情也会发生在 Button2
上,并且如果 Button1
的任务尚未完成,tryLock()
就会失败。可重入锁在这里不起作用,因为两个按钮都从同一线程锁定。
由于锁只能从主线程获取和释放,因此解决方案是否只是一个 private boolean
类成员?它是否必须是 volatile
?
最佳答案
如果你阻止 GUI 线程,那么就没有机会点击任何东西。不要使用锁。
只需一个简单的 boolean 值
就可以很好地完成任务。
您所需要做的就是将 boolean
设置为 false
,调用 SwingWorker
,然后将其重置为 true
在 done
方法中。由于在 EDT 上调用 done
方法,并且您将从 EDT 启动 SwingWorker
,因此没有线程要求。
在您所说的问题中,后台任务将发布unlock()
,具体取决于其工作原理,您可能需要使用 volatile boolean 值
.
如果您想将前端与后端分离,最好使用 Model View Presenter 之类的东西。模式,并在演示者界面中有一个 myControlsEnabled(booleanenabled)
方法。对于用户来说,启用不执行任何操作的 GUI 控件从来都不是一件好事...
关于java - 什么锁是不可重入的,即如果在同一线程中获取而没有事先释放则阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743151/
嘿,我有一个任意的 SQL 查询。从这个查询开始,我想知道这个查询将访问或更改哪些表。可能定义了一些函数或触发器,这些函数或触发器还会更改查询中声明的表之外的其他表。 我考虑过创建一个不同的 mysq
我是一名优秀的程序员,十分优秀!