通用任务定时执行实现
Quartz触发器配置
从触发器中配置一个通用触发MainStarter
统一任务处理 MainStarter的实现 主要是任务中心来执行的
public class MainStarter{// 任务中心
private TaskCenter taskCenter;
public void setTaskCenter(TaskCenter taskCenter) {
this.taskCenter = taskCenter;
}public void run() {
if(taskCenter==null) {
taskCenter = new TaskCenterSupport();
}
taskCenter.run();
}
}
public interface TaskCenter {
// 加载任务
public void loadTask(Task taskTracker);
public List getTasks();
public void run();
public void terminate();
}
【通用任务定时执行实现】任务中心存储任务,任务 Task 为代码最终执行
public abstract class Task extends Thread {
private boolean isAlive = true;
@Override
public void run() {
while (isAlive) {
try {
doRun();
} catch (Exception e) {
logger.error("run task error.", e);
}
}
}public void setAlive(boolean isAlive) {
this.isAlive = isAlive;
}// 子类业务需要实现此方法,方法中为具体业务
protected abstract void doRun() throws Exception;
}
具体业务实现 TaskCenter 的实现类 TaskCenterSupport
public class TaskCenterSupport implements TaskCenter {
private List tasks;
public List getTasks() {
return tasks;
}public void loadTask(Task task) {
if (tasks == null) {
tasks = new ArrayList<>();
}tasks.add(task);
}public void run() {
if(CollectionUtils.isNotEmpty(tasks)){
for (Task task : tasks) {
if(task != null) {
task.setAlive(true);
task.start();
}
}
}
}public void terminate() {
if(CollectionUtils.isNotEmpty(tasks)){
for (Task task : tasks) {
if(task != null) {
task.setAlive(false);
}
}tasks.clear();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.error(e.getMessage(),e);
Thread.currentThread().interrupt();
}
}
}
}
Task 的子类 ZBTask
public class ZBTask extends Task{ public ZBTask () {
TaskCenter taskCenter = TaskCenterSingleton.getInstance();
taskCenter.loadTask(this);
}public void doRun() throws Exception {
/* 具体业务实现,这里就能会定时执行,
* 若有需要还可以在此使用休眠,
* 这样只会把此线程挂起,不影响其他 Task 子类的执行
*/
}}
推荐阅读
- 多线程NSOperation
- linux定时任务contab
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 1.2序列通用操作
- 242为什么不断切换任务会更容易累()
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- IOST任务教程
- 时间管理的任务模型
- 随便写写,完成任务?
- 无聊时