使用ScheduledThreadPoolExecutor代替Timer&TimerTask

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

一般步骤是:

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

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

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

Java代码
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秒钟
}

}

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实现同一个功能。

Java代码
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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值