Как я могу создать «управляемый событиями» фоновый поток в Java? - PullRequest
5 голосов
/ 12 августа 2011

Мне нравится простота invokeLater() для отправки единиц работы в AWT EDT.Было бы неплохо иметь аналогичный механизм для отправки рабочих запросов в фоновый поток (такой как SwingWorker), но, насколько я понимаю, у них нет какого-либо механизма организации очередей и отправки событий, от которого зависит invokeLater ().

Итак, вместо этого я закончил тем, что предоставил моему фоновому потоку очередь блокировки, в которую другие потоки отправляют сообщения, и этот поток, по сути, запускает цикл приема, блокируя до прибытия сообщения.

Это, на самом деле, может быть именно так, как можно реализовать EDT-подобное поведение в фоновом потоке (или так?).С другой стороны, мне нравится простота потока, который просто вяло там болтается, обрабатывая «рабочие капли» всякий раз, когда они попадают к нему из какой-то невидимой очереди отправки событий в небе.Предоставляет ли Java способ создать такой «управляемый событиями рабочий поток»?Или очередь сообщений является правильным способом сделать это, в конце концов?Есть ли недостатки в технике передачи сообщений invokeLater()?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Шаблон проектирования для производителей и потребителей (то, что вы используете в своей очереди блокировки) - это просто другой подход к решению другого класса проблем;В EDT используется шаблон Worker Design Pattern .Взгляните на оба шаблона проектирования и посмотрите, какой из них лучше всего соответствует вашим потребностям.

  • Шаблон «производитель-потребитель» обычно используется, когда несколько потоков выполняют отдельные задачи отдельно.
  • Рабочий шаблон, используемый EDT, используется для объединения результата нескольких задач в один поток (в данном случае поток GUI).

Конечно, вы можетевозьмите шаблон Producer-Consumer и добейтесь того же поведения, что и шаблон Worker, если у вас одна очередь и один потребитель с несколькими производителями, но это лишь подчеркивает гибкость шаблонов проектирования.Таким образом, опять же, дело в том, что выбор шаблона проектирования основан на том, что лучше всего подходит для вашей конкретной ситуации - нет особенно неправильного выбора, когда шаблоны достаточно гибки, чтобы приспособиться к желаемому поведению.

1 голос
/ 12 августа 2011

Вам следует взглянуть на java.util.concurrent, точнее на Executor , которые обычно являются просто пулом потоков, которые могут обрабатывать запрос, подобный этому: executor.execute(runnableTask);. Если вы хотите, чтобы один поток обрабатывал весь запрос, то создайте свой поток с одним потоком: executor = Executors.newSingleThreadExecutor()'. Существуют также ExecutorService, которые могут возвращать значение, когда задача выполнена.

...