2014-12-01 2 views
0

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

Спасибо заранее!

+2

«Рассматриваем ли рабочий поток бесплатно, как только он начинает представлять задание», почему мы так определяем его? – didierc

+0

Рабочий поток считается «свободным», когда он способен выполнять работу (т. Е. В настоящее время не выполняет задачу). – isnot2bad

+0

Все рабочие нитки рождаются бесплатно! ;-) – haraldK

ответ

1

Ну его очень просто ..lets начала

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

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

    }
    }

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

1

Рабочий поток свободен, когда он находится в очереди 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

Хорошо. Это означает, что рабочий занят с момента, когда задача занимает от очереди до времени, затраченного на выполнение задачи, чтобы завершить ее метод запуска. Я правильно понял? – meexplorer

+1

Да, это верно. Предостережение - это если в очереди нет элементов, тогда он будет ждать, пока он будет существовать, ваш фрагмент «время, когда он занимает задание из очереди», может быть остановлен. Так что правильнее сказать - поток занят с момента, когда задача отходит от очереди до завершения метода запуска. –

+0

Спасибо, я понял. – meexplorer