欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 09:29:38
...

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 同时在执行。
【Java定时器】: Java创建定时器的三种方式(详细讲解)

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

相关标签: Java定时器