Запланированная внутренняя очередь исполнителя пула потоков Java - PullRequest
0 голосов
/ 31 октября 2018

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

Я смотрю на то, что говорят официальные документы https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

и я столкнулся с дилеммой.

Допустим, я отправил 5 задач в очередь и определил 10 потоков в пуле потоков.

  1. Есть ли вероятность, что одна из задач будет выполнена дважды

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

Желательно удалить задачу, поскольку я не хотел бы, чтобы старые задачи все еще находились в очереди через 30 минут.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Executors.newFixedThreadPool() создает новый ThreadPoolExecutor, используя LinkedBlockingQueue.

С Executors.newFixedThreadPool():

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

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

С ThreadPoolExecutor.getTask():

private Runnable getTask() {
  // ...
        try {
            Runnable r = timed ?
                workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                workQueue.take();
            if (r != null)
                return r;
            timedOut = true;
        } catch (InterruptedException retry) {
            timedOut = false;
        }
    }
}

Согласно BlockingQueue.take() контракту, извлечение элемента из очереди также подразумевает его удаление.

/**
 * Retrieves and removes the head of this queue, waiting if necessary
 * until an element becomes available.
 *
 * @return the head of this queue
 * @throws InterruptedException if interrupted while waiting
 */
E take() throws InterruptedException;
0 голосов
/ 31 октября 2018

Будет выполнено только один раз, исполнитель удалит его автоматически.

Это явно не задокументировано, в то время как документ подразумевает это:

Выполняет заданную задачу когда-нибудь в будущем.

...