【Java定时器】: Java创建定时器的三种方式(详细讲解)

Java创建定时器的三种方式

第一种,常见的thread,创建一个Thread让他让循环里一直执行,通过 Thread.sleep 来达到 定时任务的效果。

栗子如下:

public static void main(String[] args) {
        final long timeTnterval = 1000;

        Runnable runnable = new Runnable() {

            public void run() {
                while (true){
                    System.out.println("I am a handsome");
                    try {
                        Thread.sleep(timeTnterval);
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }

第二种,启动和取消任务都可以控制,可以指定你想要的delay时间(开始等待时间)。实现时,Timer类可以调度任务,而 TimerTask 类则是在run方法中实现具体任务;Timer可以调度多个任务,它是线程安全的。当 Timer 的构造函数被调用时,会创建一个线程,这个线程用来调用任务。

栗子如下:

public static void main(String[] args) throws ParseException {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Hello !!");
            }

        };

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date currentDate = simpleDateFormat.parse("2020-5-14 14:32:20");
        Timer timer = new Timer();
        // 2020-5-14 14:32:20 当前时间执行
        timer.schedule(timerTask,currentDate);
    }

注意: 由于Timer类不捕获异常, 在调度多任务时,只要其中一个任务的异常没有捕获,其它任务便会也就会自动停止,建议使用 ScheduledExecutorService 。也就时下面的第三种!

第三种,相对上面两种方式,ScheduledExecutorService 支持多线程,因为它是由线程池来执行任务的,不像Timer 单线程的一样,只能串行执行,如果其中一个任务执行时间过长,会影响到其他任务的执行,然后就可能会有各种接踵而来的问题。其次 ScheduledExecutorService 也在线程中捕获了异常,不至于出现像 Timer 类一样的问题。可以说是 Timer 类的完美替换者,即解决了单线程也处理了异常。所以推荐使用!

栗子如下:

public static void main(String[] args) {
        Runnable runnable1 = new Runnable() {
            public void run() {
                System.out.println("Handsome 1");
            }
        };

        Runnable runnable2 = new Runnable() {
            public void run() {
                System.out.println("Handsome 2");
            }
        };


        ScheduledExecutorService service = Executors
                .newSingleThreadScheduledExecutor();

        /**
         *   参数2:首次执行延迟时间
         *   参数3:每次间隔执行时间
         */

        //靓仔1号
        service.scheduleAtFixedRate(runnable1, 5, 1, TimeUnit.SECONDS);
        //靓仔2号
        service.scheduleAtFixedRate(runnable2, 5, 1, TimeUnit.SECONDS);
    }

第三种的结果:可以看到 靓仔1 靓仔2 同时在执行。
在这里插入图片描述

文章皆为学习记录,如有错误之处,欢迎指出一起学习,3q!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赖伟春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值