Недавно мой наставник попросил меня реализовать свой собственный FixedThreadPool. В пуле должно быть не более N
фиксированного числа потоков, выполняемых одновременно. У пула также будет механизм, при котором, если он заполнен, Runnables придется ждать, пока другие закончат работу. В Java, мы можем достичь этого с помощью -
ThreadPoolExecutor tpe = (ThreadPoolExecutor) Executors.newFixedThreadPool(3);
tpe.execute(t1);
tpe.execute(t2);
tpe.execute(t3);
tpe.execute(t4);
В моей реализации я всегда создаю объект new
Thread и передаю ему входящие Runnables перед его запуском. Таким образом, общее количество потоков, которые я создаю (используя новое ключевое слово), всегда равно числу Runnables. Тем не менее, максимальное количество потоков в рабочем состоянии будет соответствовать N
, установленному пользователем.
Эта реализация была отклонена моим наставником, и он объяснил мне, что цель пула потоков состоит в том, чтобы повторно использовать потоки, поэтому вы должны создавать только N
потоков и использовать их для нескольких Runnables.
Но когда я вошел в реализацию ThreadPoolExecutor.execute
в нативном коде Java, я обнаружил, что он создает новый объект для каждого Runnable, используя какую-то фабрику.
Снимок экрана из кода Java .
Теперь это как-то противоречит определению ThreadPool, в котором говорится, что потоки используются повторно. Пожалуйста, уточните это, так как мне трудно понять концепцию (которая необходима для правильной реализации моего пула).
P.S. Пожалуйста, извините мою плохую грамматику