Пауза ScheduledExecutorService
Я использую ScheduledExecutorService
выполнить задачу, которая вызывает услугу по фиксированной ставке. Служба может вернуть некоторые данные в задачу. Задача хранит данные в очереди. Некоторые другие потоки медленно выбирают элементы из очереди
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class EverlastingThread implements Runnable {
private ScheduledExecutorService executorService;
private int time;
private TimeUnit timeUnit;
private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(500);
public EverlastingThread(ScheduledExecutorService executorService, int time, TimeUnit timeUnit) {
this.executorService = executorService;
this.time = time;
this.timeUnit = timeUnit;
}
public void run() {
// call the service. if Service returns any data put it an the queue
queue.add("task");
}
public void callService() throws Exception {
// while queue has stuff dont exucute???????????
executorService.scheduleAtFixedRate(this, 0, time, timeUnit);
}
}
Как приостановить executorService, пока очередь, заполненная задачей, не будет очищена.
2 ответа
Когда исполнитель отстранен, он больше не принимает новую задачу и ожидает завершения текущей задачи. Но вы не хотите увольнять своего исполнителя, просто сделайте паузу.
Так что вы можете сделать, что в вашей задаче вы просто имеете дело с пустой очередью. Поскольку ваша задача должна выполняться только время от времени, загрузка ЦП для нее будет близка к 0, когда обработка не выполняется. это "if(!queue.isEmpty()) return;" от Питера Лоури ответ.
Во-вторых, вы используете блокирующую очередь. Это означает, что если вы вызываете метод take(), чтобы получить элемент из очереди, когда очередь пуста, поток исполнителя будет ожидать, пока какой-либо элемент будет добавлен в очередь автоматически.
Так:
- Вы не можете приостановить исполнителя, даже если это усложнит ваш код.
- Блокирующая очередь по своему дизайну делает именно то, что вам нужно: блокирует задачу, если очередь пуста.
- если вы предпочитаете, вы можете просто запустить периодическое задание и проверить, является ли очередь пустой.
- В любом случае вы уже должны использовать тот или иной способ в своей задаче, иначе у вас будет NullPointerException, когда очередь пуста.
Ты можешь сделать
if(!queue.isEmpty()) return;
в начале.
Если вы используете ScheduledExecutorService, у которого есть очередь, почему вы используете ее для добавления в другую очередь. Разве вы не можете просто использовать очередь в сервисе?