我有一个类,它接受一些SwingWorkers
并按特定顺序一次运行一个。我使用ReentrantLock
来确保一次只运行一个工作程序。通常情况下,我总是在finally子句中解锁,但我需要它保持锁定,直到工人完成。
nextWorker.getPropertyChangeSupport().addPropertyChangeListener("state",
new PropertyChangeListener()
{
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if (evt.getNewValue().equals(SwingWorker.StateValue.DONE))
{
executionLock.unlock();
}
}
});
如果不是这种情况,是否保证会调用done()?我宁愿不以这种方式调用解锁,因为它会在某种程度上违反封装。
由于项目的性质,这可能会在代码审查中出现。在这种情况下,拥有可验证的来源会很有帮助。到目前为止,我一直找不到。
答案 0 :(得分:6)
我亲自尝试使用SwingWorker
完成所有操作,但始终以done()
结束,但我认为无法保证Future
中已实施的方法正确结束,仍然存在这个Bug
不知道关于锁定/解锁另一个线程或进程的代码,但我建议使用Executor
进行多线程处理,
如何从SwingWorker
任务
我个人从来没有遇到SwingWorker
或一些不期望的缺乏的错误经历,但所有MultiThreading
大师都告诉SwingWorker
生产代码永远不会,仍然需要使用Runnable#Thread
代替SwingWorker