【JavaEE初阶】多线程 _ 基础篇 _ 定时器(案例三)

☕导航小助手☕

      🍚写在前面

            🥡一、定时器概述

            🍜二、定时器的实现

                 🍔🍔2.1 Java标准库 定时器的使用

                 🧇🧇2.2 自己模拟实现一个定时器

                 🦪🦪2.3 对自己实现的定时器的进一步优化

                            🍣🍣🍣2.3.1 为何需要再进行优化

                            🍤🍤🍤2.3.2 如何进行进一步优化(一)

                            🥩🥩🥩2.3.3 如何进行进一步优化(二)

                 🍱🍱2.4 附上自己模拟实现定时器的代码


写在前面

继多线程的阻塞队列之后,我们来学习一下 第三个经典的案例 —— 定时器~

定时器,也是开发中的一个比较常用的基础组件~

定时器,就像闹钟一样,闹钟在达到一个设定的时间以后,就会发出响声来提醒;而定时器到了设定好的时间以后,就会执行某个指定好的代码~

下面,让我们一起来看看吧~

一、定时器概述

定时器,又称 任务定时执行器~

即:到了一定的时间,就会去执行指定的任务~

在 Java标准库中,提供了一个带有定时器功能的 Timer类,Timer类 的核心方法是 schedule方法~

schedule方法 包含了两个参数,第一个参数为 即将要执行的任务代码,第二个参数为 指定多长时间后执行地一个参数中的代码(单位是 毫秒)~

如:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println("hello");
   }
}, 3000);

二、定时器的实现

2.1 Java标准库 定时器的使用

package thread;

import java.util.Timer;
import java.util.TimerTask;

public class Demo23 {
    public static void main(String[] args) {
        //Timer 是 java.util 里的一个组件
        Timer timer = new Timer();
        //schedule 这个方法的效果是 "安排一个任务",不是立即执行,而是等到设定好的时间之后再执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("这是一个要执行的任务");
            }
        },4000);
    }
}

运行结果:


在观察运行结果之后,就会提出两个小问题:

问题一:程序执行完之后,为啥没有结束呢?

实现定时器,背后涉及到了多线程,Timer 里面有线程,这个线程的运行阻止了 进程的退出~


问题二:那为什么不直接使用 sleep 呢,还专门搞了一个定时器?

使用 sleep 是把当前线程给阻塞了~

换句话说,sleep 的时间里,啥也干不了,只能干等着;但是使用定时器,之前的线程该干啥干啥~

我们可以来证实一下,加一些代码并且观察运行结果:

package thread;

import java.util.Timer;
import java.util.TimerTask;

public class Demo23 {
    public static void main(String[] args) throws InterruptedException {
        //Timer 是 java.util 里的一个组件
        Timer timer = new Timer();
        //schedule 这个方法的效果是 "安排一个任务",不是立即执行,而是等到设定好的时间之后再执行
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("这是一个要执行的任务");
            }
        },5000);
        while (true) {
            System.out.println("main");
            Thread.sleep(1000);
        }
    }
}

 运行结果:

我们从中可以看出,在 定时器定时的那段时间里,线程是在继续干活的,仍然在打印出 main~

如果使用 sleep,那么这段时间就只能干等了~

所以,平常使用的还是定时器较多~

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哎呀是小张啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值