Java是否内置了“反向”SwingWorker

时间:2011-10-17 13:41:10

标签: java multithreading swing

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 个答案:

答案 0 :(得分:2)

你可能正在寻找ExecutorService。使用Executors.newCachedThreadPool()或其他newXXX()方法获取一个,但是对于大多数用途,这个方法应该没问题。

那就是说,我相信这也是你可以用SwingWorker做的事情。只需在创建SwingWorker 之前在事件处理程序中准备数据 - 您已经在那里的EDT上了。如果你需要从非EDT线程启动它,请使用SwingUtilities.invokeAndWait()准备数据,然后分离另一个线程来进行写入(或者在你开始使用的同一个非EDT线程中进行。)< / p>

SwingWorkerExecutorService提供相同的基本服务 - 将一些工作分解为后台线程,而无需明确管理其生命周期。 SwingWorker有一种方便的与EDT通信的方法,而不是在您不需要使用的地方使用invokeLater()ExecutorService支持期货与异步任务通信的更通用(非Swing特定)方式。对于一个即发即弃的用例,你的两个都很好。