使用ScheduledExecutorService在Java中定期运行任务

时间:2019-01-01 00:00:05

标签: java executorservice java-threads

我正在研究一个程序,该程序将从数据源读取数据,并在读取数据时将其发布。我有一个读取器和一个写入器,读取器产生了几个线程来读取它需要读取的所有数据,将数据放入队列中,然后写入器从队列中读取数据并发布。

我有一个读者专用的控制器和一个作家专用的控制器。控制器实现了Callable接口,但是可以实现Runnable接口,因为我的回叫是Void

我想使用执行程序来运行两个控制器。阅读器控制器将需要每X分钟调用一次(并且X大于控制器运行所需的时间)。

现在,我正在创建Callables的列表,并将其发送到ExecutorService,即:

List<Future<Void>> futures = ExecutorService es = new Executors.newFixedThreadPoll(2);
for(Future<Void> future: futures) {
    try {
        future.get();
    } catch (Exception e) {
        // log the error
    }
}

我如何将其转换为调度执行器,该执行器每30分钟(或更确切地说,在上一次作业运行30分钟后)运行可调用对象?

1 个答案:

答案 0 :(得分:1)

好的,您可以通过几种方法来做到这一点。但是如果性能重要,您可以在自己的线程中处理这些事情,如下所示:

Cursor c = sqLiteDatabase.rawQuery("SELECT * FROM country  WHERE id='" + cursor.getString(cursor.getColumnIndex("id")) + "'", null);

c.moveToFirst();

System.out.println(c.getString(c.getColumnIndex("selected")));

,您也可以像这样使用它:

public class TaskTimer extends Thread {

private java.util.concurrent.LinkedBlockingQueue<Runnable> taskQueue;
private int timeToWait;
private Long lastTime = -1l;

public TaskTimer(int time)
{
    if(time<0)
        throw new IllegalStateException("time can not negative");

    timeToWait = time;
    taskQueue = new java.util.concurrent.LinkedBlockingQueue<>();
}


void  scheduleTask(Runnable task) throws InterruptedException {
    taskQueue.put(task);
}

boolean  tryScheduleTask(Runnable task) {
    return taskQueue.add(task);
}

@Override
public void run() {

    while (true)
    {
        try {
            Runnable a = taskQueue.take();
            if(!(lastTime==-1 || System.currentTimeMillis()-lastTime>timeToWait))
            {
                //so wait !
                synchronized (lastTime)
                {
                    lastTime.wait(timeToWait-(System.currentTimeMillis()-lastTime));
                }

            }
            try{
                a.run();
                lastTime = System.currentTimeMillis();
            }catch (Throwable e)
            {
                //todo handle e
            }
        } catch (InterruptedException e) {

            break;
        }

    }

}
}

希望我能帮助您!