Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代(二)

2014-11-23 19:04:10 · 作者: · 浏览: 78
tion { final TimerTask task1 = new TimerTask() { @Override public void run() { throw new RuntimeException(); } }; final TimerTask task2 = new TimerTask() { @Override public void run() { System.out.println("task2 invoked!"); } }; Timer timer = new Timer(); timer.schedule(task1, 100); timer.scheduleAtFixedRate(task2, new Date(), 1000); } }
上面有两个任务,任务1抛出一个运行时的异常,任务2周期性的执行某个操作,输出结果:

task2 invoked!
Exception in thread "Timer-0" java.lang.RuntimeException
	at com.zhy.concurrency.timer.ScheduledThreadPoolDemo01$1.run(ScheduledThreadPoolDemo01.java:24)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)

由于任务1的一次,任务2也停止运行了。。。下面使用ScheduledExecutorService解决这个问题:

package com.zhy.concurrency.timer;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class ScheduledThreadPoolDemo01
{


	public static void main(String[] args) throws InterruptedException
	{

		final TimerTask task1 = new TimerTask()
		{

			@Override
			public void run()
			{
				throw new RuntimeException();
			}
		};

		final TimerTask task2 = new TimerTask()
		{

			@Override
			public void run()
			{
				System.out.println("task2 invoked!");
			}
		};
		
		
		
		ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
		pool.schedule(task1, 100, TimeUnit.MILLISECONDS);
		pool.scheduleAtFixedRate(task2, 0 , 1000, TimeUnit.MILLISECONDS);

	}
}

代码基本一致,但是ScheduledExecutorService可以保证,task1出现异常时,不影响task2的运行:

task2 invoked!
task2 invoked!
task2 invoked!
task2 invoked!
task2 invoked!...

3、Timer执行周期任务时依赖 系统时间

Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化会出现一些执行上的变化,ScheduledExecutorService基于时间的延迟,不会由于系统时间的改变发生执行变化。


上述,基本说明了在以后的开发中尽可能使用ScheduledExecutorService(JDK1.5以后)替代Timer。


好了,如果博客中存在错误,请留言指出~