Пул потоков построен на идее, что, поскольку создание потоков снова и снова занимает много времени, мы должны пытаться перерабатывать их как можно больше.Таким образом, пул потоков - это набор потоков, которые выполняют задания, но не уничтожаются при завершении задания, а вместо этого «возвращаются в пул» и либо выполняют другую работу, либо бездействуют, если делать нечего.
Обычно базовая реализация представляет собой потокобезопасную очередь, в которую программист помещает задания, а группа потоков, управляемых реализацией, продолжает опрашивать (я не намекаю на то, что они заняты), очередь на работу.
В Java пул потоков представлен классом ExecutorService
, который может быть:
- fixed - создать пул потоков с фиксированным числом потоков
- cached - динамически создаети уничтожает потоки по мере необходимости
- single - пул с одним потоком
Обратите внимание, что поскольку потоки пула потоков работают описанным выше образом (т.е. перерабатываются), в случаефиксированного пула потоков не рекомендуется иметь задания, которые блокируют операции ввода-вывода, так как потоки, выполняющие эти задания, будут эффективныудаляются из пула до тех пор, пока они не завершат работу, и, таким образом, могут возникнуть взаимоблокировки.
Что касается массива потоков, то это так же просто, как создать любой массив объектов:
Thread[] threads = new Thread[10]; // array of 10 threads