Я пытаюсь понять шаблон Reactor (параллельный), но во многих примерах речь идет о «рабочих потоках». Что такое рабочие потоки? Чем они отличаются от «обычных» потоков? И какова их роль в схеме реактора?
Что такое рабочие потоки и какова их роль в шаблоне реактора?
Ответы (2)
Шаблон Reactor используется с рабочими потоками для преодоления распространенного сценария в приложениях: в конечном итоге вам нужно выполнить много работы, но вы не знаете, какая работа и когда, а создание потоков — дорогостоящая операция.
Идея состоит в том, что вы создаете множество потоков, которые поначалу ничего не делают. Вместо этого они «ждут работы». Когда поступает работа (в виде кода), какая-то служба-исполнитель (реактор) идентифицирует простаивающие потоки из пула и назначает им работу для выполнения.
Таким образом, вы можете заплатить цену за создание всех потоков один раз (а не каждый раз, когда нужно выполнить какую-то работу). В то же время ваши темы являются общими; они будут выполнять любую порученную им работу вместо того, чтобы специализироваться на чем-то конкретном.
Для реализации см. пулы потоков.
Я предполагаю, что вы говорите о чем-то подобном этой документации по пулам потоков:
Большинство реализаций исполнителей в java.util.concurrent используют пулы потоков, состоящие из рабочих потоков. Этот тип потока существует отдельно от задач Runnable и Callable, которые он выполняет, и часто используется для выполнения нескольких задач.
Рабочие потоки — это обычные потоки, но они существуют отдельно от классов Runnable
или Callable
, над которыми они работают. Если вы расширяете Thread
или создаете Thread
с аргументом Runnable
, задача напрямую связывается с объектом Thread
.
Когда вы создаете пул потоков с помощью Executors.newFixedThreadPool(10);
(или других подобных методов), вы создаете пул из 10 потоков, которые могут запускать любое количество различных классов Runnable
или Callable
, отправленных в пул. Под крышками они все еще Thread
просто более гибкие из-за того, как они завернуты.
С точки зрения шаблона реактора, различные типы событий обрабатываются потоками обработчика, что похоже. Поток не привязан к одному классу событий, но будет запускать любое количество различных событий по мере их возникновения.
Runnable
имеет метод void run()
, а Callable<T>
имеет метод T call()
. Callable
методы позволяют вам возвращать значение из задания, которое вы отправляете в рабочий пул.
- person Gray; 05.11.2012