多线程:定时器的实现

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是一个关于时间字段的枚举类,用于指定时间参数的单位。

发布了70 篇原创文章 · 获赞 1 · 访问量 2269

猜你喜欢

转载自blog.csdn.net/caozp913/article/details/103465463