有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程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) 个答案

  1. # 1 楼答案

    你可能在找^{}。使用^{}或其他newXXX()方法获取一个,但对于大多数使用,该方法应该是可以的

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

    SwingWorkerExecutorService提供相同的基本服务——将一些工作拆分到后台线程中,而不必显式地管理其生命周期SwingWorker有一种方便的方法可以与EDT通信,而无需在不需要使用的地方到处使用invokeLater(),并且ExecutorService支持futures作为一种更通用(非特定于Swing)的异步任务通信方式。对于一个火灾和遗忘用例,就像你的一样,两者都很好