2010-11-02 5 views
5

Наше приложение Swing выполняет некоторые длительные задачи в фоновом потоке, используя отличный класс SwingWorker. Однако многие старые Mac поддерживают только Java 5, поэтому мы хотим скомпилировать наше приложение как 5, а не 6. Поскольку SwingWorker был представлен на Java 6, мы больше не можем его использовать.Java 5 SwingWorker replacement

Будет ли приемлемой замена, если мне нужно только что-то сделать в фоновом режиме, а затем передать ее в графическом интерфейсе, когда это будет сделано? Или я забываю что-то важное?

public static void wannabeSwingWorker(final Runnable doInBackground, final Runnable callback) { 
    Thread backgroundThread = new Thread(new Runnable() { 
     public void run() { 
      doInBackground.run(); 
      SwingUtilities.invokeLater(callback); 
     } 
    }); 
    backgroundThread.start(); 
} 

ответ

10

Я позволю кому-то комментарий о пригодности вашего кода, но в качестве альтернативы вы можете скачать Backport из SwingWorker для использования в Java 5 here.

+0

На самом деле, это говорит о том, что это оригинальная реализация SwingWorker, и это Sun портировал ее в стандартную библиотеку. –

3

Ваш код должен работать правильно; конечно, вы потеряете все другие функции SwingWorker (возврат частичных результатов и прогресса, отмена, поддержка слушателей),

2

Посмотрите на Foxtrot, который работает иначе, чем большинство качели параллельности LIBS.

Вместо того, чтобы запускать фоновый поток для выполнения долговременной задачи, он эмулирует подход, выполняемый Swing, когда вы показываете модальное диалоговое окно, выполняя задачу, выполняемую в течение длительного времени, на Swing EDT и запуская новый поток для обработки События GUI.

При работе с заданием с длительным сроком выполнения, которое возвращает значение, которое вам необходимо немедленно задействовать, это приводит к очень приятной процедурной/неконкурентной части кода программы (точно так же, как проверка возвращаемого значения от JOptionPane.showConfirmDialog(...)) ,

Смежные вопросы