Есть ли в Java встроенный «обратный» SwingWorker - PullRequest
1 голос
/ 17 октября 2011

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 Ответ

2 голосов
/ 17 октября 2011

Вы, вероятно, ищете ExecutorService. Получите один, используя Executors.newCachedThreadPool() - или другие newXXX() методы, но этот метод должен быть в большинстве случаев приемлемым.

Тем не менее, я считаю, что это то, что вы также можете сделать с SwingWorker. Просто подготовьте свои данные в обработчике событий до того, как создадите SwingWorker - вы уже там находитесь на EDT. Если вам нужно инициировать это из потока без EDT, подготовьте данные, используя SwingUtilities.invokeAndWait(), а затем выделите другой поток, чтобы выполнить запись (или сделайте это в том же потоке без EDT, с которого вы начали).

SwingWorker и ExecutorService предоставляют одну и ту же базовую услугу - раскрутить некоторую работу в фоновый поток без явного управления его жизненным циклом. SwingWorker имеет удобный метод связи с EDT без использования invokeLater() повсюду, который вам не нужен, и ExecutorService поддерживает фьючерсы в качестве более общего (без Swing -специфичный) способ общения с асинхронной задачей. В случае использования «забей и забудь», так как у вас обоих все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...