任务调度设计与实现(Timer、Thread、Quartz)

一、概要

1、设计目标:

 * 调度
 * 主要功能:立刻执行、延时执行、循环执行

二、实现

设计思路

定义一个接口(ISchedule),来规范行为

实现类来实现 该接口

package spzc.platform.utils.schedule;

/**
 * 调度,接口
 * @author live
 * Jan 8, 2019 11:30:18 AM
 */
public interface ISchedule {
	void execute();
	void execute(long delay);
	void execute(long delay, long period);
	
	void cancel();
}

1、实现方式1 借助Timer类

package spzc.platform.utils.schedule;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 基于Timer实现调度
 * 
 * @author live Jan 8, 2019 11:31:31 AM
 */
public class TimerSchedule implements ISchedule {
	private Timer timer;
	private TimerTask task;

	private TimerSchedule() {
		timer = new Timer();
	}

	private TimerSchedule(TimerTask task) {
		this();
		this.setTask(task);
	}

	public TimerSchedule(Runnable runnable) {
		this(new TimerTask() {
			@Override
			public void run() {
				try {
					runnable.run();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	@Override
	public void execute() {
		this.execute(0);
	}

	@Override
	public void execute(long delay) {
		if (this.task != null) {
			timer.schedule(task, delay);
		}
	}

	@Override
	public void execute(long delay, long period) {
		if (this.task != null) {
			timer.schedule(task, delay, period);
		}
	}

	public TimerTask getTask() {
		return task;
	}

	public void setTask(TimerTask task) {
		this.task = task;
	}

	@Override
	public void cancel() {
		timer.cancel();
	}

	public static void main(String[] args) {
		ISchedule s = new TimerSchedule(new Runnable() {
			@Override
			public void run() {
				System.out.println("执行了:" + new Date());
			}
		});
		s.execute(2000,1000);
	}
}

2、实现方式2 借助Thread类

package spzc.platform.utils.schedule;

import java.util.Date;

public class ThreadSchedule implements ISchedule {

	private Thread thread;
	private volatile boolean allowRun = true;
	private ThreadSchedule() {
	}

	ThreadSchedule(Runnable runnable) {
		this();
		setThread(new Thread(runnable));
	}

	@Override
	public void execute() {
		this.getThread().start();
	}

	@Override
	public void execute(long delay) {
		execute(delay, -1);
	}

	@Override
	public void execute(long delay, long period) {
		if (isAllowRun()) {
			try {
				Thread.sleep(delay);
				this.getThread().start();
				if (period >= 0) {
					this.getThread();
					Thread.sleep(period);
					execute(delay, period);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	public void cancel() {
		this.setAllowRun(false);
	}

	public Thread getThread() {
		return thread;
	}

	public void setThread(Thread thread) {
		this.thread = thread;
	}

	public boolean isAllowRun() {
		return allowRun;
	}

	public void setAllowRun(boolean allowRun) {
		this.allowRun = allowRun;
	}

	public static void main(String[] args) {
		ISchedule s = new ThreadSchedule(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("执行了:" + new Date());
			}
		});
		
//		s.execute();
//		
//		try {
//			Thread.sleep(2000);
//		} catch (InterruptedException e) {
//			e.printStackTrace();
//		}
		
//		s.execute(2000);
		s.execute(2000,1000);
		
	}
}

3、实现方式三 (待)

开源工具包 Quartz

ScheduledExecutor

开源工具包 JCronTab

发布了48 篇原创文章 · 获赞 4 · 访问量 3213

猜你喜欢

转载自blog.csdn.net/Sunxn1991/article/details/86136049
今日推荐