1 回答

TA貢獻1808條經(jīng)驗 獲得超4個贊
最好使用單個調(diào)度程序,但您不需要為此編寫自己的調(diào)度程序。您可以使用Executors.newScheduledThreadPool(1)具有一定數(shù)量線程的單個實例來安排所有任務(wù)。
考慮以下代碼:
class TaskScheduler {
private ScheduledExecutorService scheduledExecutorService;
public TaskScheduler(int threads) {
this.scheduledExecutorService = Executors.newScheduledThreadPool(threads);
}
//Portion to add task
public TaskExecutionContext schedule(String taskName, Runnable task, long initialDelay, long frequency) {
TaskExecutionContext context = new TaskExecutionContext(taskName);
context.getTaskResult().setFrequencyInSeconds(frequency);
ScheduledFuture scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(task, initialDelay, frequency, TimeUnit.SECONDS);
context.setScheduledFuture(scheduledFuture);
return context;
}
}
class TaskExecutionContext {
private String taskName;
private TaskResult taskResult;
private ScheduledFuture scheduledFuture;
public TaskExecutionContext(String taskName) {
this.taskName = taskName;
this.taskResult = new TaskResult();
this.taskResult.setTaskName(taskName);
this.taskResult.setStartTime(new Date());
//DB Operation on creation
}
public TaskResult stop() {
try {
System.out.println("Stopping : " + this.taskName);
this.taskResult.setTaskName(this.taskName);
this.taskResult.setEndTime(new Date());
scheduledFuture.cancel(false);
//DB Operation on stopping
System.out.println("Stopping : finished - " + this.taskName + " @ " + new Date());
} catch (Exception e) {
e.printStackTrace();
}
return this.taskResult;
}
public TaskResult getTaskResult() {
return this.taskResult;
}
public void setScheduledFuture(ScheduledFuture scheduledFuture) {
this.scheduledFuture = scheduledFuture;
}
}
如果您需要一些關(guān)于計劃、創(chuàng)建和停止任務(wù)的額外操作 - 可能,最好有單獨的TaskExecutionContext,它將滿足您的所有需求。
當(dāng)您需要安排任務(wù)并將其傳遞給調(diào)度程序時,創(chuàng)建一個上下文。
添加回答
舉報