Пауза 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 ответов
когда исполнитель shudown, он больше не принимает новую задачу и ждать завершения текущих. Но вы не хотите прерывать своего исполнителя, просто приостановите его.
Итак, что вы можете сделать, так это то, что в вашей задаче вы просто имеете дело с пустой очередью. Поскольку ваша задача должна выполняться только время от времени, потребление процессора будет близким к 0 для него, когда нет обработки. это "если(!очередь.isEmpty ()) return; " from Peter Lawrey ответ.
во-вторых, вы используете блокирующие очереди. Это означает, что если вы вызываете метод take() для получения элемента очереди, пока очередь пуста, поток исполнителя будет ждать, пока какой-либо элемент не будет добавлен в очередь автоматически.
Так:
- вы не можете приостановить исполнителя и даже это усложнит код.
- блокирующая очередь делает по дизайну точно что вам нужно: блокировка задачи, если очередь пуста.
- если вы предпочитаете вы можете просто позволить периодическая задача выполнить и проверить, очередь пуста.
- вы уже должны использовать один или другой способ в вашей задаче в любом случае в противном случае вы бы Исключение NullPointerException при очереди быть пустой.
можно сделать
if(!queue.isEmpty()) return;
на старте.
Если вы используете ScheduledExecutorService, который имеет очередь, почему вы используете его для добавления в другую очередь. Вы не можете просто использовать очередь в сервисе?