JDK5之前的定时器:Timer类
javax.util.Timer是一个对线程进行计时执行的类,它的构造方法和成员方法如下
示例1:指定延迟后执行一次
//任务定时器
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("爆炸!");
}
},10000);//指定10秒后爆炸,单位毫秒
//定义一个9秒的秒表
for (int i = 1; i < 10 ; i++) {
try {
Thread.sleep(1000);//让当前线程每过1秒执行一次
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
示例2:从指定延迟开始后重复执行
// 使用的是schedule的另一个重载形式
// 任务定时器
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("爆炸!");
}
},10000,3000);//指定10秒后爆炸,之后每隔3秒爆炸一次
示例3:双重定时器
双重定时器就是计时器里面再递归嵌套计时器,不断循环调用,这里使用匿名内部类的方式是错误的,因为匿名内部类只能使用一次,无法实现多次调用。
//任务定时器
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("爆炸!");
new Timer().schedule(this,2000);
}
},2000);//表示每2秒执行一次
应该将被递归调用的定时器代码定义在TimerTask的子类中,再去递归调用
private static class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("爆炸!");
new Timer().schedule(new MyTimerTask(),2000);
}
}
public static void main(String[] args) {
new Timer().schedule(new MyTimerTask(),2000);
}
示例4:利用双重定时器实现不等时循环执行
即2秒执行一次,再4秒执行一次,再2秒执行一次,再4秒执行一次,……往复循环
关键在于秒数上的控制,当第二层定时器结束后需要回到第一层定时器的秒数
private static int count = 0;
private static class MyTimerTask extends TimerTask{
@Override
public void run() {
count = (count +1)%2;
System.out.println("爆炸!");
new Timer().schedule(new MyTimerTask(),2000+2000*count);
}
}
public static void main(String[] args) {
new Timer().schedule(new MyTimerTask(),2000);
}
线程池实现定时器
ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(4);
- newScheduledThreadPool:创建一个指定线程数的线程池,此线程池支持定时以及周期性执行任务的需求。
ScheduledExecutorService接口中有关于定时器的一些方法
TimeUnit是一个关于时间字段的枚举类,用于指定时间参数的单位。