когда мы считаем рабочий поток свободным в Executor Service

1

У меня возникла концептуальная проблема в понимании работы fixedthreadpool службы-исполнителя.
Предположим, что у меня есть фиксированный поток потоков из n потоков, и я отправляю несколько задач этой службе. Теперь, если рабочий доступен, он выполняет поставленную задачу, а другие отправленные задачи ждут в очереди до тех пор, пока работник не станет свободным.
Мой вопрос: когда мы рассматриваем рабочего как свободную рабочую нить?
Рассматриваем ли рабочий поток бесплатно, как только он отправляет задание независимо от завершения задачи, или мы рассматриваем рабочий поток занятым до тех пор, пока выполняется поставленная задача.
Пусть говорят, что у нас есть рабочий поток W1 в пуле, и задача Op1 представляется исполнителю.
W1 запускает Op1 в момент T1, и через некоторое время Op1 завершит свое исполнение в момент T3. Здесь T3> T1
Теперь мы рассматриваем W1 как свободный, как только он запускает Op1 в момент T1, или считается занятым и будет свободным в момент T3.

Заранее спасибо !!

  • 2
    «Считаем ли мы рабочий поток свободным, как только он запускает отправленную задачу», почему мы определяем его таким образом?
  • 0
    Рабочий поток считается «свободным», когда он способен выполнять работу (т. Е. В настоящее время он не выполняет задачу).
Показать ещё 2 комментария
Теги:
multithreading
executorservice

2 ответа

2

Рабочий поток свободен, когда он takes ИНГ из очереди. Любой рабочий поток снимает очередь, когда она больше не выполняет задачу. Таким образом, это будет выглядеть примерно так:

private final BlockingQueue<Runnable> workQueue;

class WorkerThread {
   public void run(){
      while(true){
        Runnable r = workQueue.take(); // worker thread is 'free'
        r.run(); // worker thread is busy
      }
   }
}

Поэтому, чтобы ответить на ваш вопрос, конкретный рабочий поток является бесплатным, когда он не выполняет задачу, отправленную службе.

  • 0
    Хорошо ... это означает, что работник занят с момента, когда он берет задачу из очереди, до времени, затрачиваемого задачей на выполнение метода запуска ... Я правильно понял?
  • 1
    Да это правильно. Предостережение: если в очереди нет элементов, то они будут ждать, пока они не появятся, ваш фрагмент «времени, которое требуется для выполнения задачи из очереди» может быть пропущен. Поэтому правильнее будет сказать - поток занят с момента, когда он берет задачу из очереди, до завершения метода run.
Показать ещё 2 комментария
2

Ну его очень простые..ты начинают

  1. Пул потоков выполняет задачу. Задача, которая представляется ему, хранится в очереди.
  2. Задача реализует интерфейс runnable, поэтому он имеет метод run, который не принимает никаких аргументов и возвращает void. Этот метод действует как точка входа или метод, который вызывается "потоком, который будет выполнять вашу задачу" в пуле протектора.
  3. Теперь перебираем пул потоков: a. Комбинированием пула потоков из внутренней очереди может быть arrayblockqueue/linkedblockingqueue и т.д. Главное, это всегда очередь. б. Группа потоков, которые непрерывно обследуют эту очередь. Нить, выполняющая вашу задачу, выглядит примерно так:

    void run()
    {
    в то время как (истина)
    {
    //Получить задачу из внутренней очереди пула потоков (1)
    // Вызов метода выполнения задачи. Если выполнение задачи вызывает исключение во время выполнения, поймайте его и покажите. (2)

    }
    }

Так как вы можете видеть, что работник будет свободен только в том случае, если в очереди нет задачи. Работник будет либо опросить очередь для задачи (1), либо выполнить задачу (2)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню