多线程Java是否有内置的“反向”SwingWorker
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()
来代替它
# 1 楼答案
你可能在找^{} 。使用^{} 或其他
newXXX()
方法获取一个,但对于大多数使用,该方法应该是可以的也就是说,我相信这也是你可以用
SwingWorker
做的事情。在创建一个SwingWorker
之前,只需在事件处理程序中准备数据即可–您已经在那里的EDT上了。如果需要从非EDT线程启动此操作,请使用SwingUtilities.invokeAndWait()
准备数据,然后分离另一个线程来执行写入操作(或者在开始的同一个非EDT线程中执行)SwingWorker
和ExecutorService
提供相同的基本服务——将一些工作拆分到后台线程中,而不必显式地管理其生命周期SwingWorker
有一种方便的方法可以与EDT通信,而无需在不需要使用的地方到处使用invokeLater()
,并且ExecutorService
支持futures作为一种更通用(非特定于Swing)的异步任务通信方式。对于一个火灾和遗忘用例,就像你的一样,两者都很好