Используя таймер для запуска SwingWorker? - PullRequest
4 голосов
/ 16 мая 2011

Задача, которую мне нужно выполнить, включает в себя запрос некоторых данных с внешнего сервера, выполнение некоторой (довольно продолжительной) обработки данных, а затем обновление графического интерфейса пользователя с результатами обработки. Поскольку сервер может не отвечать, задача хорошо подходит для SwingWorker: метод doInBackground() получает результаты, а затем метод done обновляет графический интерфейс.

Мне нужно, чтобы это происходило раз в несколько секунд. Я знаю, что могу просто использовать цикл while и Thread.sleep и создавать новый SwingWorker после каждого сна. Но все, что я читал, не одобряет использование петель и сна. Я хотел бы использовать таймер, но:

  • Использование таймера колебания кажется контрпродуктивным; так как они работают на EDT, у меня практически не будет причин использовать метод SwingWorker doInBackground. Если сервер не отвечает, графический интерфейс не отвечает.

  • Использование java.util.Timer кажется немного расточительным: кажется, что он создает фоновый поток для TimerTask (), и, поскольку я просто создаю SwingWorker для выполнения реальной работы, я по существу фоновый поток, который создает другой фоновый поток.

Кто-нибудь может сказать мне, какое решение лучше? Я хотел бы придерживаться SwingWorker, поскольку он кажется идеально подходящим для этой задачи, но я бы хотел избежать использования цикла while, если смогу помочь.

Спасибо

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

Я не понимаю, почему вы не можете использовать Swing Timer для запуска Swing Worker. Что вы пробовали?

2 голосов
/ 16 мая 2011

Вы можете использовать ScheduledExecutorService :

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 

// get a scheduled executor service with one thread
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// schedule the worker at an intervall of 5 seconds
scheduler.scheduleAtFixedRate(myWorker, 0, 5, TimeUnit.SECONDS);
1 голос
/ 23 мая 2011

Я думаю, что вы на правильном пути с SwingWorker. Теперь вам нужно взглянуть на его методы публикации и обработки. В процессе обработки вы публикуете () объект из фонового потока, затем вызывается метод process () в потоке Swing (EDT), чтобы вы могли обновить графический интерфейс.

Таким образом, нет кучки таймеров и других потоков для координации.

У javadocs есть простой пример с простыми числами: http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

0 голосов
/ 16 мая 2011

Насколько велик набор данных, которые вы извлекаете?Если он достаточно мал, я бы полностью отменил задачу выборки / обработки и отображения.

  1. Использование какого-либо рода в кеше памяти для хранения самого последнего обработанного набора данных.
  2. Используйте javax.swing.Timer для обновления графического интерфейса с кэшированными данными.
  3. Используйте java.util.Timer для извлечения данных из базы данных, обработки их и обновления кэша.
  4. Будьте осторожны с синхронизациейпроблемы между двумя раза в вашем кеше.Вы не хотите, чтобы ваш таймер колебания захватывал данные в то время, когда другой таймер обновляет их.
...