我正在使用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,直到任务填充的队列被清除。
答案 0 :(得分:4)
你可以做到
if(!queue.isEmpty()) return;
一开始。
如果您使用的是具有队列的ScheduledExecutorService,为什么要使用它来添加到另一个队列。你能不能只在服务中使用队列吗?
答案 1 :(得分:3)
当执行者被甩掉时,它不再接受新任务并等待当前的任务终止。但是你不想终止执行者,只需暂停它。
所以你能做的就是在你的任务中你只需要处理一个空队列。因为您的任务只是不时执行,所以当没有处理时,CPU消耗将接近0。这是“if(!queue.isEmpty())return;”来自Peter Lawrey的回应。
其次,您使用阻塞队列。这意味着如果在队列为空时调用方法take()来获取排队元素,执行程序线程将等待,直到某个元素自动添加到队列中。
所以: