gpt4 book ai didi

java - 什么锁是不可重入的,即如果在同一线程中获取而没有事先释放则阻塞?

转载 作者:行者123 更新时间:2023-11-30 04:05:53 24 4
gpt4 key购买 nike

当我单击Button1时,我想在主线程中tryLock(),然后启动后台任务。后台任务完成后会将 unlock() 发布到主线程。如果未获取锁定,则单击不应执行任何操作而只是返回。我不想从后台任务的线程中锁定,因为初始化任务对象的成本很高。如果先前的按钮单击已经获取了锁,我想避免完全创建任务对象。

同样的事情也会发生在 Button2 上,并且如果 Button1 的任务尚未完成,tryLock() 就会失败。可重入锁在这里不起作用,因为两个按钮都从同一线程锁定。

由于锁只能从主线程获取和释放,因此解决方案是否只是一个 private boolean 类成员?它是否必须是 volatile

最佳答案

如果你阻止 GUI 线程,那么就没有机会点击任何东西。不要使用锁。

只需一个简单的 boolean 值就可以很好地完成任务。

您所需要做的就是将 boolean 设置为 false,调用 SwingWorker,然后将其重置为 truedone 方法中。由于在 EDT 上调用 done 方法,并且您将从 EDT 启动 SwingWorker,因此没有线程要求。

在您所说的问题中,后台任务将发布unlock(),具体取决于其工作原理,您可能需要使用 volatile boolean 值 .

如果您想将前端与后端分离,最好使用 Model View Presenter 之类的东西。模式,并在演示者界面中有一个 myControlsEnabled(booleanenabled) 方法。对于用户来说,启用不执行任何操作的 GUI 控件从来都不是一件好事...

关于java - 什么锁是不可重入的,即如果在同一线程中获取而没有事先释放则阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20743151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com