У меня есть (или много) задача cron, и она выполняется каждые 5 секунд (это не имеет значения), и я хочу, чтобы она не выполнялась, если предыдущий запуск не завершен.Вот мой код: и если планировщик выполняется в первый раз в 12:00:00, я хочу, чтобы он выполнялся после 12:00:10 второй (третий ...) раз.Кто-нибудь может мне помочь?
public class Task {
private Long id;
private String cron;
private Long millis; //the task runnig time(begin to end)
//getter setter
}
public class TaskSchedulerTest {
private Map<Long, ScheduledFuture> futureMap = new HashMap<>();
public static void main(String[] args) {
new TaskSchedulerTest().t();
}
private void t() {
Task t1 = new Task(1L, "0/3 * * * * *", 10000L);
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.initialize();
taskScheduler.setThreadNamePrefix("scheduler task");
ScheduledFuture sf1 = taskScheduler.schedule(new RunnableTask(t1), new CronTrigger(t1.getCron()));
futureMap.put(t1.getId(), sf1);
}
private class RunnableTask implements Runnable {
private Task task;
private int times;
private RunnableTask() {
}
private void println(String string) {
System.out.println(Thread.currentThread().getName() + string);
}
private RunnableTask(Task task) {
this.task = task;
}
@Override
public void run() {
//check if previous is not finished, i checked it's isDone()
//and it return false while the previous is running
println(" begin: " + task.getId() + " times: " + times);
ScheduledFuture future = futureMap.get(task.getId());
println(" done: " + future.isDone());
try {
Thread.sleep(task.getMillis()); //or do something
} catch (InterruptedException e) {
e.printStackTrace();
}
println(" end: " + task.getId() + " times: " + times);
times++;
}
}
}
Я использую новый cron "0/3 * * * * *" и заменяю sleep для чтения и записи файла, например:
FileInputStream fis = new FileInputStream("D:\\test\\test.exe");
FileOutputStream fos = new FileOutputStream("D:\\test\\a-" + times + "");
fos.write(IOUtils.toByteArray(fis));
fos.flush();
fos.close();
fis.close();
Иэто журнал:
начало задачи планировщика 1: 1 раз: 0 отметка времени: 05: 51
конец задачи планировщика 1: 1 раз: 0 отметка времени: 06: 10
начало задачи планировщика 1: 1 раз: 1 отметка времени: 06: 11
конец задачи планировщика 1: 1 раз: 1 отметка времени: 06: 17
начало задачи планировщика 2: 1 раз: 2 отметка времени:06: 18
конец задачи планировщика 2: 1 раз: 2 отметка времени: 06: 24
начало задачи планировщика 1: 1 раз: 3 отметка времени: 06: 25
конец задачи планировщика 1: 1 раз: 3 отметки времени: 06: 33
начало задачи планировщика 3: 1 раз: 4 отметки времени: 06: 34
конец задания планировщика 3: 1 раз: 4 отметки времени: 06: 40
Журнал означает, что моя проблема не проблема.