Пул потоков Попробуйте реализовать собственный пул потоков. В качестве аргументов конструктора пулу передается его емкость (количество рабочих потоков). Как только пул создан, он сразу инициализирует и запускает потоки. Внутри пула очередь задач на исполнение организуется через LinkedList. При выполнении у пула потоков метода execute(Runnabler), указанная задача должна попасть в очередь исполнения, и как только появится свободный поток – должна быть выполнена. Также необходимо реализовать метод shutdown(), после выполнения которого новые задачи больше не принимаются пулом (при попытке добавить задачу можно бросать IllegalStateException), и все потоки для которых больше нет задач завершают свою работу. Дополнительно можно добавить метод awaitTermination() без таймаута, работающий аналогично стандартным пулам потоков