`

ScheduledExecutorService执行定时任务

 
阅读更多

ScheduledExecutorService

 

作者:赵磊

博客:http://elf8848.iteye.com

 

java.util.concurrent.Executors可创建一个线程池,它可给定延迟后定期地执行任务。
Executors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)


其中的scheduleAtFixedRate 和 scheduleWithFixedDelay 方法可以创建并执行任务,这些任务一直执行 ,并且是可以取消的任务。

 

 

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.logging.SimpleFormatter;

/**
 * ScheduledExecutorService 测试
 * 
 * @author zhaolei 2012-5-23
 */
public class ScheduledThreadPoolTest {

	private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
	static SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd dd:mm:ss");

	/**
	 * beepForTime
	 */
	public static void beepForTime() {
		
		/**
		 * 要执行的任务
		 */
		final Runnable beeper = new Runnable() {
			int i=0;
			public void run() {
				System.out.println("beep:"+(i++)+"----"+sf.format(new Date(System.currentTimeMillis())));
				//throw new RuntimeException();
				
				//任务耗时2秒
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		


		int startTime=3;
		int each=5;
		System.out.println("任务将于"+startTime+"秒后开始,每"+each+"秒执行1次");
		
		/**
		 * 每each秒执行一次任务,两次任务的执行间隔是each秒(前面定义的变更)
		 * 
		 * 
		 * 创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;
		 * 也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,
		 * 接着在 initialDelay + 2 * period 后执行,依此类推。如果任务的任何一个执行遇到异常,
		 * 则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。
		 * 如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。
		 * 参数:
		 * command - 要执行的任务
		 * initialDelay - 首次执行的延迟时间
		 * period - 连续执行之间的周期
		 * unit - initialDelay 和 period 参数的时间单位 
		 * 
		 */
		//final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, startTime, each, TimeUnit.SECONDS);
		
		
		/**
		 * 
		 * 每each秒执行一次任务,两次任务的执行间隔是each秒(前面定义的变更)+任务执行用时
		 * 
		 * 创建并执行一个在给定初始延迟后首次启用的定期操作,
		 * 随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
		 * 如果任务的任一执行遇到异常,就会取消后续执行。
		 * 否则,只能通过执行程序的取消或终止方法来终止该任务。 
		 * 参数:
		 * command - 要执行的任务
		 * initialDelay - 首次执行的延迟时间
		 * period - 连续执行之间的周期
		 * unit - initialDelay 和 period 参数的时间单位 
		 * 
		 */
		final ScheduledFuture<?> beeperHandle = scheduler.scheduleWithFixedDelay(beeper, startTime, each, TimeUnit.SECONDS);
		
		/**
		 * 创建并执行在给定延迟后启用的一次性操作。
		 * 
		 * 这里用于在N时间后取消任务
		 */
		scheduler.schedule(new Runnable() {
			public void run() {
				System.out.println("取消任务");
				beeperHandle.cancel(true);
			}
		}, 60, TimeUnit.SECONDS);
	}

	/**
	 * main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		beepForTime();
	}
}
 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics