Что такое рабочие потоки и какова их роль в шаблоне реактора?

Я пытаюсь понять шаблон Reactor (параллельный), но во многих примерах речь идет о «рабочих потоках». Что такое рабочие потоки? Чем они отличаются от «обычных» потоков? И какова их роль в схеме реактора?


person Jon    schedule 05.11.2012    source источник
comment
Пожалуйста, дайте ссылки на ссылки, о которых вы говорите.   -  person Gray    schedule 05.11.2012
comment
en.wikipedia.org/wiki/Reactor_pattern   -  person Jon    schedule 05.11.2012
comment
Я ничего не вижу о рабочих темах на этом сайте @Jon.   -  person Gray    schedule 05.11.2012
comment
Правильно, но это было только для шаблона реактора, вот еще один today.java.net/pub/a/today/2007/02/13/   -  person Jon    schedule 05.11.2012
comment
Хорошо, верно. В этой ссылке показано, что либо вы можете определить поток, прикрепленный к определенному потоку, либо вы можете использовать пул потоков, где задания могут быть отправлены в пул. Рабочие потоки в пуле могут выполнять различные типы заданий. Но в статье термин рабочие потоки широко используется, чтобы быть просто потоками.   -  person Gray    schedule 05.11.2012
comment
Хорошие ответы ниже, но я думаю, что они упускают из виду один момент: нет разницы между тем, как реализован рабочий поток, и тем, как реализован любой другой поток. Единственная разница заключается в коде, который они выполняют. Мы называем их рабочими потоками, потому что они ждут работы. Это все.   -  person Solomon Slow    schedule 06.10.2014


Ответы (2)


Шаблон Reactor используется с рабочими потоками для преодоления распространенного сценария в приложениях: в конечном итоге вам нужно выполнить много работы, но вы не знаете, какая работа и когда, а создание потоков — дорогостоящая операция.

Идея состоит в том, что вы создаете множество потоков, которые поначалу ничего не делают. Вместо этого они «ждут работы». Когда поступает работа (в виде кода), какая-то служба-исполнитель (реактор) идентифицирует простаивающие потоки из пула и назначает им работу для выполнения.

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

Для реализации см. пулы потоков.

person Aaron Digulla    schedule 05.11.2012
comment
Хороший ответ. Я не знал о шаблоне Reactor. - person Adam Arold; 05.11.2012
comment
Отличное объяснение, это действительно полезно. - person Jon; 05.11.2012

Я предполагаю, что вы говорите о чем-то подобном этой документации по пулам потоков:

Большинство реализаций исполнителей в java.util.concurrent используют пулы потоков, состоящие из рабочих потоков. Этот тип потока существует отдельно от задач Runnable и Callable, которые он выполняет, и часто используется для выполнения нескольких задач.

Рабочие потоки — это обычные потоки, но они существуют отдельно от классов Runnable или Callable, над которыми они работают. Если вы расширяете Thread или создаете Thread с аргументом Runnable, задача напрямую связывается с объектом Thread.

Когда вы создаете пул потоков с помощью Executors.newFixedThreadPool(10); (или других подобных методов), вы создаете пул из 10 потоков, которые могут запускать любое количество различных классов Runnable или Callable, отправленных в пул. Под крышками они все еще Thread просто более гибкие из-за того, как они завернуты.

С точки зрения шаблона реактора, различные типы событий обрабатываются потоками обработчика, что похоже. Поток не привязан к одному классу событий, но будет запускать любое количество различных событий по мере их возникновения.

person Gray    schedule 05.11.2012
comment
Спасибо за объяснение, это действительно прояснило. Есть ли разница между интерфейсами Runnable и Callable? - person Jon; 05.11.2012
comment
Взгляните на Javadocs @Jon. Runnable имеет метод void run(), а Callable<T> имеет метод T call(). Callable методы позволяют вам возвращать значение из задания, которое вы отправляете в рабочий пул. - person Gray; 05.11.2012