Threadpool повторное использование потоков

Я знаю, что эту тему задавали много, но я не уверен в одной детали. Теперь threadpool не позволяет потоку умереть после завершения задачи и повторно использует его позже по мере необходимости (как сказано, здесь, здесь и т. д.) Но позвольте сказать, что у моего runnable есть переменные в конструкторе -

MyRunnable(int a){
  this.a = a; 
}

затем, когда мы пытаемся запустить Runnable с Executors.newFixedThreadPool (или чем-то подобным), мы говорим

executor.execute(new MyRunnable(a)); // executor being Executors.newFixedThreadPool

теперь, если переменная 'a' отличается при каждом выполнении, может ли Threadpool действительно повторно использовать ее позже? Я действительно не могу понять, как это будет работать, но я никогда не видел, чтобы «Threadpool повторно использует потоки, кроме ...», отсюда и путаница.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
466
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, с моей точки зрения, алгоритм работы пула потоков будет похож и выглядит, как показано ниже.

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 ставится в очередь. Когда будут свободные потоки, они будут проверять эту очередь и брать из нее задачи.

Другие вопросы по теме