Я знаю, что эту тему задавали много, но я не уверен в одной детали. Теперь threadpool не позволяет потоку умереть после завершения задачи и повторно использует его позже по мере необходимости (как сказано, здесь, здесь и т. д.) Но позвольте сказать, что у моего runnable есть переменные в конструкторе -
MyRunnable(int a){
this.a = a;
}
затем, когда мы пытаемся запустить Runnable с Executors.newFixedThreadPool (или чем-то подобным), мы говорим
executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool
теперь, если переменная 'a' отличается при каждом выполнении, может ли Threadpool действительно повторно использовать ее позже? Я действительно не могу понять, как это будет работать, но я никогда не видел, чтобы «Threadpool повторно использует потоки, кроме ...», отсюда и путаница.




Итак, с моей точки зрения, алгоритм работы пула потоков будет похож и выглядит, как показано ниже.
while (check if the pool is not shutdown) {
Runnable task = pool.fetchTaskFromQueue(); // fetch the Task from the queue. In your case it object of MyRunnable class
task.run(); // call the run() of MyRunnable object
}
Пул потоков восстанавливает Thread, а не реализацию Runnable/ Callable. Итак, согласно пулу потоков, он повторно использует ваш variable a.
Нет, ни отправленный вами Runnable, ни связанные с ним переменные не будут использоваться повторно.
Я думаю, вы неправильно поняли Thread и Runnable, это разные вещи. Runnable - это просто обычный объект, за исключением того, что его метод run будет выполнен, когда вы создадите с ним новый поток. Вы можете проверить этот вопрос.
Повторное использование потока не означает повторное использование Runnable, это означает, что поток продолжает выполнять разные Runnable.
Когда вы создаете Thread с Runnable и start, эта ветка выглядит так:
new Thread(new Runnable()).start()
метод run() этого Runnale будет выполнен, и после выхода run() этот Thread также завершится.
Но Runnbale, который вы отправляете в ThreadPoolExecutor, не тот, который указан в приведенном выше коде для создания потока.
Вкратце, потоки в ThreadPoolExecutor создаются следующим образом:
Runnable worker = new Runnable() {
@Override
public void run() {
Runnable firstTask = getFirstTask(); // the first runnable
firstTask.run();
Runnable queuedTask;
while ( (queuedTask = getTaskFromQueue()) != null) { // This could get blocked
queuedTask.run();
}
}
};
new Thread(worker).start();
Обратите внимание, что Runnable, используемый для запуска потока, не тот, который вы отправили в пул.
Когда вы отправляете новый Runnable, пул потоков проверяет, нужно ли создавать новый поток (на основе такого аргумента, как corePoolSize).
Worker с этим Runnable как FirstTask, создает новый поток с этим Worker и запускает его.Runnbale ставится в очередь. Когда будут свободные потоки, они будут проверять эту очередь и брать из нее задачи.