Java多线程——线程的sleep方法、中断线程的睡眠

2023-11-11

一、关于Sleep方法的应用

  • public static void sleep(long millis) throws InterruptedException
    • 让当前正在执行的线程进入休眠(暂时停止执行)指定的毫秒数。

    • 静态方法:Thread.Sleep(1000);

      • 参数

        millis - 以毫秒为单位的睡眠时间长度


sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

Sleep方法的代码实现:

public class test03 {
    public static void main(String[] args) {
        try {
            Thread.sleep(1000*5);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //5秒后执行这里的代码
        System.out.println("hello");
        for (int i=1;i<=5;i++) {
            //每隔2秒执行一次该代码
            System.out.println(Thread.currentThread().getName()+":"+i);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

二、Sleep的面试题

public class test03 {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        mr.setName("t");
        mr.start();
        try {
            //问题:这行代码会让线程mr进入休眠状态吗?
            //不会。。。。
            mr.sleep(1000*5);//这行代码在执行的时候还是会转换成Thread.Sleep(5000);
                             //这行代码的作用是:让当前进程进入休眠状态,也就是main进程进入休眠状态
                             //这行代码出现在main方法中,会让main线程休眠
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //而是5秒之后这里才会执行:
        System.out.println("hello");
​
    }
}
class MyRunnable extends Thread{
    @Override
    public void run() {
        for (int i=1;i<=10;i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

三、终止线程的睡眠

  • public void interrupt()
    • 中断此线程。

public class test03 {
    public static void main(String[] args) {
        Thread th = new Thread(new MyRunnable());
        th.setName("t");
        th.start();
        //希望5秒之后,th线程醒来
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //中断th线程的睡眠(这种中断睡眠的方式依靠了Java的异常处理机制)
        th.interrupt();//干扰
    }
}
class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("begin");
        //重点:run当中的异常不能throws,只能try  catch。
        try {
            Thread.sleep(1000*10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

四、强行终止线程的执行

不建议使用

这种方式存在很大的缺点:容易丢失数据,因为直接将线程杀死!

public class test03 {
    public static void main(String[] args) {
        Thread th = new Thread(new MyRunnable());
        th.setName("t");
        th.start();
        //模拟5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //5秒之后th线程终止
        th.stop();//已过时,不建议使用。
        /*  t----->1
            t----->2
            t----->3
            t----->4
            t----->5*/
    }
}
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i=1;i<=10;i++){
            System.out.println(Thread.currentThread().getName()+"----->"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
​
    }
}

出于这种情况,我们应该合理的终止一个线程的执行。。

五、合理的终止一个线程的执行

public class test03 {
    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread th = new Thread(r);
        th.setName("t");
        th.start();
        //模拟5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //5秒之后th线程终止
        //你想要什么时候终止线程,只需要把true改为false,线程就终止了
        r.run = false;
    }
}
class MyRunnable implements Runnable{
    //定义一个布尔类型的标志
    boolean run = true;
    @Override
    public void run() {
        for (int i=1;i<=10;i++){
            if (run){
                System.out.println(Thread.currentThread().getName()+"----->"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                //终止线程
                return;
            }
        }
    }
}

这种方式是很常用的,以后的开发中可能会用到的.

如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!!  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程——线程的sleep方法、中断线程的睡眠 的相关文章

随机推荐

  • easy excel date 类型解析报错_最新Pandas.read_excel()全参数详解(案例实操,如何利用python导入excel)...

    pandas read excel 的作用 将Excel文件读取到pandas DataFrame中 支持从本地文件系统或URL读取的xls xlsx xlsm xlsb和odf文件扩展名 支持读取单一sheet或几个sheet 以下是该函
  • 【数据集】Python爬取某国内所有航班记录

    一 分析数据集 我们需要获取航班的数据集合 dcity acity airlineName flightNumber airportName departureDate arrivalDate punctualityRate price 航
  • 一言以蔽之

    其上申韩者 其下必佛老 这句的意思是 统治者如果采用法家式的高压态势治理国家 那么民众就只能从道家和佛家里寻找心理安慰了 也就是道家和佛家为专制权力之下的人提供了一种虚假的逃避方式 菜根谭 作者糅合了儒家的中庸 道家的无为 释家的出世和自身
  • BEPS生态过程模型简介和使用

    一 BEPS模型发展简介 二 BEPS模型代码和参数简介 代码链接 link 模型运行 待更新
  • 在vue项目中设置网站图标

    怎么在我们的Vue项目中设置自定义的网站图标 首先我们需要先制作个ico图标 大小为32 32的 放到static文件夹下 附制作网站 我们把制作好的ico图片改名为 favicon ico 注 必须改名 放到我们项目中的static文件夹
  • softmax分类器 python实现

    转自 http blog csdn net wds2006sdo article details 53699778 utm source itdadao utm medium referral 算法 算法参考的是Andrew 的课件与这篇文
  • Android中获取View宽高方法

    今天遇到一个问题 就是view获取宽度 高度都为0的问题 其实这个大家都遇到过 这里转载别人的 大家好共同学习 本文转载于 http www jianshu com p f56c92e29dea Android开发中经常需要获取控件的宽高
  • FileZilla的下载与安装

    FileZilla的下载与安装 为什么要使用FileZilla进行文件互传呢 Windows下 FileZilla客户端下载与安装 1 FileZilla的下载 1 FileZilla的安装 1 双击运行安装包 点击 i agree 2 n
  • Shader中的一些专业用语的解释

    Shader中的一些专业用语的解释 此文章收录于我主页顶置的 Unity Shader入门精要文章目录 点击即可跳转 一 什么是OPenGL DirectX 简单的来说 就是图像应用编程的接口 这些接口用语渲染二维和三维的图形 架起了上层应
  • 【毕业设计】基于单片机的桌面炫酷律动灯条 -物联网 嵌入式 单片机

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • 公办幼儿园教师要涨工资了???

    终于盼到这一天了 已在市区公办园上班3年多却一直没有编制的季馨 听说从明年开始要涨工资了 高兴坏了 记者从日前召开的全市学前教育工作会议上获悉 从2012年起 确保市区公办幼儿园中具有国家教师资格的聘用教师最低工资水平不得低于当地最低工资标
  • 蓝桥杯 问题 1083: Hello, world!(C/C++ vector实现)

    问题 1083 Hello world 时间限制 1Sec 内存限制 64MB 提交 944 解决 476 题目描述 This is the first problem for test Since all we know the ASCI
  • 《一周搞定模电》—功率放大器

    系列文章目录 文章目录 系列文章目录 前言 一 功率放大电路三极管的工作模式 二 功率放大器内部结构 前言 功率放大器指一种以输出较大功率为目的的放大电路 特点 输出电压大 输出电流大 放大电路的输出电阻与负载匹配 电压放大器和功率放大器的
  • 三子棋创作(c语言)

    我们写三子棋之前首先要思考一下三子棋的实现逻辑 一 1 游戏菜单 是选择开始游戏还是结束游戏 2 打印一个棋盘出来 并且进行棋盘的初始化 即没有旗子的棋盘 3 玩家下棋 用 表示 4 电脑下棋 用 表示 5 判断胜负 电脑和玩家下完棋之后
  • java使用lambda表达式对List集合进行操作(Java8)

    import java util ArrayList import java util List import java util function Predicate import java util stream Collectors
  • token会被截取吗_OAuth2 为什么要用 code 换 token

    先简单介绍下 OAuth2 再用一个例子说明下为什么要用 code 换 token OAuth2 简单介绍 4 个角色 resource owner 可以授权访问被保护资源的实体 如果是人的话 即是最终用户 resource server
  • h2数据库优缺点

    h2数据库是嵌入式的内存型数据库 也可以存储在磁盘上 效率比通过socket调用的redis执行的要快 纯java编写就一个jar h2数据库的缺点是不适合大数据量高并发的操作
  • centos 安装防火墙,并开启对应端口号

    1 查看防火墙状态 命令 systemctl status firewalld service 开启防火墙时 提示没有安装防火墙 root localhost systemctl start firewalld service Failed
  • 关于锁的面试题

    1 synchronized和ReentranctLock有什么区别 底层实现 synchronized是jvm层面的锁 通过monitor对象完成 对象只能在同步代码块和同步方法中调用wait notify方法 ReentranctLoc
  • Java多线程——线程的sleep方法、中断线程的睡眠

    一 关于Sleep方法的应用 public static void sleep long millis throws InterruptedException 让当前正在执行的线程进入休眠 暂时停止执行 指定的毫秒数 静态方法 Thread