使用ScheduledThreadPoolExecutor代替Timer&TimerTask

标签: scheduledthreadpoolexecutor timer timertask | 发表时间:2013-01-25 20:18 | 作者:
出处:http://www.iteye.com

        如果我们想要延迟(deferred)或者周期性(periodic)执行一个任务,我们可以使用Java API 的Timer和TimerTask类。

        一般步骤是:

               继承TimerTask(抽象类),复写run方法,方法体里代表需要执行的任务。

               实例化Timer(可以通过构造方法设置为守护线程),调用schedule的一个重载方法实现延迟或者周期性执行自定义任务。

       下面的例子演示了程序启动5秒后每隔1秒警报器叫一声,10次后终止程序执行。

import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 自定义Timer类
 * 
 */
class BeepTimer extends TimerTask {

	private Toolkit toolKit;

	private int count;

	public BeepTimer() {
		toolKit = Toolkit.getDefaultToolkit();
	}

	@Override
	public void run() {
		if (count == 10)
			System.exit(1);
		toolKit.beep();
		count++;
	}

}

public class TimerDemo {

	public static void main(String... args) {

		BeepTimer bt = new BeepTimer();	//非守护线程
		Timer timer = new Timer();

		timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后开始鸣叫,鸣叫10次,每次相隔1秒钟
	}

}

 

    但是Timer和TimerTask存在一些缺陷:

        1:Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。

        2:Timer创建的线程没有处理异常,因此一旦抛出非受检异常,该线程会立即终止。

 

    JDK 5.0以后推荐使用ScheduledThreadPoolExecutor。该类属于Executor Framework,它除了能处理异常外,还可以创建多个线程解决上面的问题。

        下面利用ScheduledThradPoolExecutor实现同一个功能。

import java.awt.Toolkit;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ExecutorDemo {

	public static void main(String... args) {
		
		ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);
		MyTask myTask = new MyTask();
		
		stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);
	}

	private static class MyTask implements Runnable {

		private Toolkit toolKit;
		private int count;
		
		public MyTask() {
			toolKit = Toolkit.getDefaultToolkit();
		}
		@Override
		public void run() {
			if(count == 10) {
				System.out.println("Termination!");
				System.exit(1);
			}
			toolKit.beep();
			System.out.println("Beep--------");
			count++;
		}
	}
}

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [scheduledthreadpoolexecutor timer timertask] 推荐:

使用ScheduledThreadPoolExecutor代替Timer&TimerTask

- - ITeye博客
        如果我们想要延迟(deferred)或者周期性(periodic)执行一个任务,我们可以使用Java API 的Timer和TimerTask类.         一般步骤是:.                继承TimerTask(抽象类),复写run方法,方法体里代表需要执行的任务.

Java中用Servlet Listener实现定时监听 (Timer、TimerTask)

- - C++博客-牵着老婆满街逛
    (1)实现 javax.servlet.ServletContextListener 接口的两个方法:contextInitialized()和contextDestroyed().     contextInitialized():当Servlet容器启动时会执行contextDestroyed():当Servlet容器停止时会执行.

Android简单的Timer小例子

- - CSDN博客推荐文章
写惯java的人可能会认为Timer的使用应该如下:. 程序功能很简单:10秒后,SetTitle为“hear me?”,然后,实际上这样做是不行的,这跟Android的线程安全有关. 但实际上的用法应该通过配合Handler来实现timer功能的. 作者:chang_xing 发表于2012-8-3 18:48:39 原文链接.

Spring实现后台的任务调度TimerTask和Quartz

- - CSDN博客互联网推荐文章
最近整后台,涉及到两个后台调度的问题. 一是以时间间隔为条件的轮询调度;. 运用场景:每隔5分钟抓取数据;. 二是一某个时间点为条件的轮询调度;. 运用场景:后台日志货报表生成上传,每个周一生成上一周的,每个月初生成上一月. 其实按周来执行调度,用前面一个场景也可以实现,但是按月生成,因为每月时间不固定,必须动态判断和执行.

Java定时任务调度:用ExecutorService取代Timer

- - ITeye博客
《Java并发编程》一书提到,用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:. 如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为. Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程. 这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了.

Windows XP EOS Countdown Timer — 蛋疼的XP死亡倒计时工具 | 小众软件 > 桌面工具

- Antonin - 小众软件
Windows XP 作为微软最成功的操作系统已经在市场上生存了近 10 年,直至今日仍有 N 多人不愿升级,微软也无可奈何. 近日,微软发布了一个给 Windows XP 倒计时的Gadget小工具 —— “Windows XP EOS Countdown Timer.gadget ” 来提醒你XP还有多少寿命.