Java实现简单定时任务

时间:2022-01-20 23:30:18

了解了一下Java实现简单定时任务的三种方式,分别做了个例子。

自己写篇以记录、备忘。

注释都清楚了,不另外解释。

方式一:

package test.timertask;

/**
 * 使用Thread.sleep的方式来实现
 * 这种方式完全是自己实现的,该控制的地方控制,怎么写都可以
 * @author wz
 */
public class MyTimerTask {
	public static void main(String[] args) {
		MyTimerTask mt  = new MyTimerTask();
		mt.task();
	}
	
	public void task(){
		
		final long timeInterval = 1000;
		(new Runnable() {
			public void run() {
				while (true) {
					// 执行任务
					System.out.println("do the task……");
					try {
						Thread.sleep(timeInterval);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).run();
		//这里直接调runnable的run方法了,这样是由main方法的执行线程直接转去执行这个runnable了(同一个线程)
		//当然也可new一个Thread,将runnable扔进去后调用其start方法(另启一线程)
	}
}

方式二:

package test.timertask;

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

/**
 * 
 * @author wz
 * 通过Timer和TimerTask来实现,jdk自己实现且封装了其操作,
 * TimerTask实现Runnable接口,但是其实现正是留给用户制定任务的接口
 * 然后通过Timer来执行即可,Timer另启线程来执行任务,且实现了线程同步的,所示线程安全的
 * Timer维持一个任务队列,可以调度多个任务
 * 
 */
public class MyTimerTask2 {
	public static void main(String[] args) {
		MyTimerTask2 mt2  =new MyTimerTask2();
		mt2.task();
	}
	public void task(){
		//制定一个任务
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				System.out.println("执行任务ing");
			}
		};
		
//		task - 所要安排的任务。
//		delay - 执行任务前的延迟时间,单位是毫秒。
//		period - 执行各后续任务之间的时间间隔,单位是毫秒。 
		Timer timer = new Timer();
		long delay = 0;
		long intevalPeriod = 1 * 1000;
		timer.scheduleAtFixedRate(task, delay, intevalPeriod);
	}
}

方式三:

package test.timertask;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * 
 * @author wz
 * jdk1.5提供了支持并发的定时任务处理工具ScheduledExecutorService
 * 1.以线程池的方式来执行任务,效率高了
 * 2.可以设置开始延迟时间和任务取消时间
 *
 */
public class MyTimerTask3 {
	public static void main(String[] args) {
		MyTimerTask3 mtt = new MyTimerTask3();
		mtt.taskForAPeriod();
	}

	private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

	public void taskForAPeriod() {
		//定义一个任务
		final Runnable task = new Runnable() {
			public void run() {
				System.out.println("执行任务");
			}
		};
		
//		scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):
//		通过ScheduledExecutorService的scheduleAtFixedRate来执行任务
//		参数
//		command - 要执行的任务
//		initialDelay - 首次执行的延迟时间
//		period - 连续执行之间的周期
//		unit - initialDelay 和 period 参数的时间单位
		final ScheduledFuture<?> taskHandle = scheduler.scheduleAtFixedRate(task, 1, 1, TimeUnit.SECONDS);
		
		
//		schedule(Runnable command,long delay,TimeUnit unit)创建并执行在给定延迟后启用的一次性操作。 (取消任务本身也是一个任务,一次去下就OK)
//		参数:
//		command - 要执行的任务
//		delay - 从现在开始延迟执行的时间
//		unit - 延迟参数的时间单位 
		scheduler.schedule(new Runnable() {
			public void run() {
				taskHandle.cancel(true);	//取消任务
			}
		}, 10, TimeUnit.SECONDS);	//在10个TimeUnit.SECONDS时间单位后
	}

}