java - Java是否内置了 "reversed"SwingWorker

标签 java multithreading swing

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 线程中执行此操作)您开始的线程。)

SwingWorkerExecutorService 提供相同的基本服务 - 将一些工作分拆到后台线程中,而无需显式管理其生命周期。 SwingWorker 有一种与 EDT 通信的便捷方法,无需在不需要使用的地方使用 invokeLater(),并且 ExecutorService > 支持 futures 作为与异步任务通信的更通用(非 Swing 特定)方式。对于“一劳永逸”的用例,因为您的两个都很好。

关于java - Java是否内置了 "reversed"SwingWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794629/

相关文章:

java - FATAL EXCEPTION : main, 但 eclipse 没有显示任何错误

java - 无法为对话框设置 View

.net - 如何防止线程中的无限循环消耗所有CPU资源?

Java 和使用不同的实例

java - 智能 : Is there an Intention Action to convert old style Log4J calls to new style SLF4J calls?

java - 播放/录制 .DSS 或 .DS2 文件

c++ - 尽管多线程 web 应用程序有很高的限制,但 mmaped 文件的文件描述符用完了

multithreading - 在以 Start-ThreadJob 启动的线程中使用作用域变量修改 PowerShell $

Java GUI 打印空白页

java - JDialog 不可见