ScheduledExecutorService类 scheduleWithFixedDelay() 和 scheduleFixedRate() 区别

先说scheduleWithFixedDelay(),

scheduleWithFixedDelay从字面意义上可以理解为就是以固定延迟(时间)来执行线程任务,它实际上是不管线程任务的执行时间的,每次都要把任务执行完成后再延迟固定时间后再执行下一次。

而scheduleFixedRate呢,是以固定频率来执行线程任务,固定频率的含义就是可能设定的固定时间不足以完成线程任务,但是它不管,达到设定的延迟时间了就要执行下一次了。

不知道大家理解了没有,下面是示例:

 

public static void scheduleWithFixedDelay() {

	final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
	// 响铃线程
	final Runnable beeper = new Runnable() {
		public void run() {
			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			long time = (long) (Math.random() * 1000);
			// 输出线程的名字和使用目标对象及休眠的时间
			System.out.println(sf.format(new Date())+"线程:"+Thread.currentThread().getName()+":Sleeping"+time+"ms");
			try {
				Thread.sleep(time);
			} catch (InterruptedException e) {
			}
			}
		};
		// 设定执行线程计划,初始10s延迟,每次任务完成后延迟10s再执行一次任务
		final ScheduledFuture<?> sFuture=scheduledExecutorService.scheduleWithFixedDelay(beeper,10,10,TimeUnit.SECONDS);

		// 40s后取消线程任务
		scheduledExecutorService.schedule(new Runnable() {
			public void run() {
				sFuture.cancel(true);
				scheduledExecutorService.shutdown();
			}
		}, 40, TimeUnit.SECONDS);

	}


执行结果:

2013-10-16 10:45:51 线程:pool-1-thread-2:Sleeping 726ms
2013-10-16 10:46:02 线程:pool-1-thread-2:Sleeping 288ms
2013-10-16 10:46:12 线程:pool-1-thread-2:Sleeping 294ms

从执行结果数量看只执行了3次,因为每次要把任务执行完成再执行下一次,导致40s按10s的延迟时间不足以执行4次。

 

 

public static void scheduleAtFixedRate() {
	// 声明线程池
	final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
	// 响铃线程
	final Runnable beeper = new Runnable() {
		public void run() {
			SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			long time = (long) (Math.random() * 1000);
			// 输出线程的名字和使用目标对象及休眠的时间
			System.out.println(sf.format(new Date()) + " 线程:" + Thread.currentThread().getName() + ":Sleeping " + time + "ms");
			try {
				Thread.sleep(time);
			} catch (InterruptedException e) {
			}
		}
	};
	// 计划响铃,初始延迟10s然后以10s的频率执行响铃
	final ScheduledFuture<?> beeperHandle = scheduledExecutorService.scheduleAtFixedRate(beeper, 10, 10, TimeUnit.SECONDS);

	// 取消响铃并关闭线程
	final Runnable cancelBeeper = new Runnable() {
		public void run() {
			System.out.println(Thread.currentThread().getName() + "CANCEL...");
			beeperHandle.cancel(true);
			scheduledExecutorService.shutdown();
		}
	};
	// 60s后执行scheduleAtFixedRate
	scheduledExecutorService.schedule(cancelBeeper, 40, TimeUnit.SECONDS);
}

 

执行结果:

2013-10-16 10:16:50 线程:pool-1-thread-1:Sleeping 868ms
2013-10-16 10:17:00 线程:pool-1-thread-1:Sleeping 587ms
2013-10-16 10:17:10 线程:pool-1-thread-1:Sleeping 313ms
2013-10-16 10:17:20 线程:pool-1-thread-1:Sleeping 969ms
pool-1-thread-1CANCEL...

看时间我们就可以知道是每个10s就执行下一次了。

 

发布了18 篇原创文章 · 获赞 70 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章