暂停ScheduledExecutorService

时间:2011-07-01 08:00:45

标签: java scheduled-tasks executor

我正在使用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 :(得分:4)

你可以做到

if(!queue.isEmpty()) return; 

一开始。

如果您使用的是具有队列的ScheduledExecutorService,为什么要使用它来添加到另一个队列。你能不能只在服务中使用队列吗?

答案 1 :(得分:3)

当执行者被甩掉时,它不再接受新任务并等待当前的任务终止。但是你不想终止执行者,只需暂停它。

所以你能做的就是在你的任务中你只需要处理一个空队列。因为您的任务只是不时执行,所以当没有处理时,CPU消耗将接近0。这是“if(!queue.isEmpty())return;”来自Peter Lawrey的回应。

其次,您使用阻塞队列。这意味着如果在队列为空时调用方法take()来获取排队元素,执行程序线程将等待,直到某个元素自动添加到队列中。

所以:

  • 你不能暂停执行者 它会使你的代码复杂化。
  • 阻塞队列完全按设计完成 你需要什么:如果阻止任务 队列是空的。
  • 如果你愿意,你可以放过 定期任务运行并检查是否 queue isEmpty。
  • 你应该已经使用了一个或者 无论如何,你的任务中的其他方式 否则你会有 队列时出现NullPointerException 是空的。