SwingWorker
允许您在后台Thread
中准备一些数据,然后在 EDT 中使用它。我正在寻找一个执行相反操作的实用程序:在 EDT 中准备数据,然后将其传递给后台线程
。
如果您好奇,用例是将 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()
替换它。
最佳答案
您可能正在寻找ExecutorService
。使用 Executors.newCachedThreadPool()
获取一个– 或其他 newXXX()
方法,但该方法对于大多数用途来说应该没问题。
也就是说,我相信这也可以使用 SwingWorker
完成。只需在创建 SwingWorker
之前在事件处理程序中准备好数据即可 - 您已经在 EDT 中了。如果您需要从非 EDT 线程启动此操作,请使用 SwingUtilities.invokeAndWait()
准备数据,然后分离另一个线程来执行写入操作(或在同一个非 EDT 线程中执行此操作)您开始的线程。)
SwingWorker
和 ExecutorService
提供相同的基本服务 - 将一些工作分拆到后台线程中,而无需显式管理其生命周期。 SwingWorker
有一种与 EDT 通信的便捷方法,无需在不需要使用的地方使用 invokeLater()
,并且 ExecutorService
> 支持 futures 作为与异步任务通信的更通用(非 Swing 特定)方式。对于“一劳永逸”的用例,因为您的两个都很好。
关于java - Java是否内置了 "reversed"SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794629/