这就是我的代码结构
Class TaskA implements runnable {
void run() {
if(not leader node) {
exit this task;
(never run it again)
}
//do stuff
}
};
相似地
Class TaskB implements runnable { ....
Class TaskC implements runnable { ....
class Scheduler {
TaskA memberTaskA;
TaskB memberTaskB;
TaskC memberTaskC;
private ScheduledExecutorService executor;
private ScheduledFuture futureA, futureB, futureC;
public Scheduler(TaskA a, TaskB b, TaskC c) {
memberTaskA = a;
memberTaskB = b;
memberTaskC = c;
}
public void start() {
exectuor = Executors.newSingleThreadScheduledExecutor();
futureA = scheduleWithFixedDelay(memberTaskA,
6000,
6000,
TimeUnit.MILLISECONDS);
futureB = scheduleWithFixedDelay(memberTaskB,
6000,
6000,
TimeUnit.MILLISECONDS);
futureC = scheduleWithFixedDelay(memberTaskC,
6000,
6000,
TimeUnit.MILLISECONDS);
}
};
如果在任务的 run() 方法中满足“不是领导节点”条件,我需要能够不再安排任务。一种可能的方法是为每个任务创建一个单独的停止方法,例如 stopTaskA()、stopTaskB() 和 stopTaskC()。将 Scheduler 类的对象传递给每个 Task 并显式调用相应的 stopTask() 方法。例如:
stopTaskA(){
futureA.cancel(false);
}
这看起来不是一个非常优雅的解决方案。
有更好设计的想法吗?