SwingWorker
可让您在后台Thread
准备一些数据,然后在EDT中使用它。我正在寻找一个相反的实用工具:在EDT中准备数据,然后将其传递给后台Thread
。
如果您感到好奇,则用例是将JTable
的状态保存到磁盘(列顺序,大小等)。我需要在EDT中与它的模型交谈,但不想从这个线程写入磁盘。
类似的东西:
void saveCurrentState(final Table table) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TableColumns state = dumpState(table);
saveToDisk(table.getTableKey(), state);
}
});
}
dumpState()
需要在EDT中运行。 saveToDisk()
不应该在EDT中运行。整件事都是故意包裹在invokeLater()
中,我不能用invokeAndWait()
替换它。
答案 0 :(得分:2)
你可能正在寻找ExecutorService
。使用Executors.newCachedThreadPool()
或其他newXXX()
方法获取一个,但是对于大多数用途,这个方法应该没问题。
那就是说,我相信这也是你可以用 SwingWorker
做的事情。只需在创建SwingWorker
之前在事件处理程序中准备数据 - 您已经在那里的EDT上了。如果你需要从非EDT线程启动它,请使用SwingUtilities.invokeAndWait()
准备数据,然后分离另一个线程来进行写入(或者在你开始使用的同一个非EDT线程中进行。)< / p>
SwingWorker
和ExecutorService
提供相同的基本服务 - 将一些工作分解为后台线程,而无需明确管理其生命周期。 SwingWorker
有一种方便的与EDT通信的方法,而不是在您不需要使用的地方使用invokeLater()
,ExecutorService
支持期货与异步任务通信的更通用(非Swing特定)方式。对于一个即发即弃的用例,你的两个都很好。