首页 > 其他分享 >Thread 之 sleep() 方法

Thread 之 sleep() 方法

时间:2023-03-13 20:56:27浏览次数:47  
标签:log Thread t1 线程 sleep 方法 CPU

Thread.sleep(long millis)方法能够以毫秒为时间单位暂停当前执行的线程,参数值为毫秒不能为负数,否则将抛出 IllegalArgumentException 异常

1、它总是暂停当前执行的线程

2、实际休眠的线程在唤醒开始执行前依赖于操作系统定时器和调度器,对于一个平稳的系统来住,线程实际执行的时间接近于指定线程休眠时间,但是对于一个忙碌的系统来说它将稍微超出一些

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("开始执行");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t1");
        t1.start();
        log.info("t1 线程的状态为: {}",t1.getState());
        TimeUnit.SECONDS.sleep(1);
        log.info("t1 线程的状态为: {}",t1.getState());
    }
}

线程调用 sleep() 方法之后,线程状态由 RUNNABLE 转变为 TIME_WAITING

线程 sleep 时间到了之后,线程由阻塞态转变为就绪态,就绪态的线程不会立马执行,需要等待操作系统分配 CPU 时间片,所以系统空闲时,该线程能在较短的时间内分配到 CPU 时间片,故线程实际执行的时间接近于指定线程休眠时间,但是当系统繁忙时,该线程需要等待一定的时间才能获取到 CPU 的执行权,所以线程实际执行要稍微超出 sleep 参数时间

3、当线程休眠时不会丢失已经获得的监控和锁

4、任何线程都能中断当前休眠的线程、将导致 InterruptedException 异常抛出

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            log.info("开始执行");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                log.info(Thread.currentThread().getName()+" 被打断了");
                log.info("呜呜呜..........");
                e.printStackTrace();
            }
        }, "t1");
        t1.start();
        log.info(Thread.currentThread().getName()+" 将要开始打断 t1 线程");
        t1.interrupt();
    }
}

在其它线程中通过调用 t1.interrupt() 方法可以打断 t1 线程,t1 线程被打断后会抛出异常,转而执行 catch 块中的代码

5、有时会在循环中写 Thread.sleep(0),这样做的意义是什么

调用 sleep() 方法之后,线程的状态由运行态转变为阻塞状态,而休眠时间到了之后,线程由阻塞态转变为就绪态,而 sleep(0) 可以看做是不经过阻塞态,线程由运行态直接变成就绪状态,让出 CPU 的执行权,从而触发操作系统立刻进行一次 CPU 的竞争,重新计算优先级,防止该线程独占 CPU 资源,实际上 sleep(0) 效果并不好,CPU 占用率还是很高,建议写 sleep(50)

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        while(true){
            log.info("hello xiao mao mao");
        }
    }
}

一直循环的情况下 CPU 占用 98%,加入 Thread.sleep(0)

@Slf4j
public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        while(true){
            // 让出 CPU 控制权
            TimeUnit.MILLISECONDS.sleep(50);
            log.info("hello xiao mao mao");
        }
    }
}

可以很明显的看出 CPU 占用率降低到了 4.6%

 

标签:log,Thread,t1,线程,sleep,方法,CPU
From: https://www.cnblogs.com/xiaomaomao/p/17212823.html

相关文章

  • async 与 Thread 的错误结合
    async与Thread的错误结合  在TAP出现之前,我们可以通过Thread来完成一些线程操作,从而实现多线程和异步操作。在TAP出现之后,有时候为了更高精度的控制线程,我......
  • 【ChatGPT解答】python 如何判断某个方法是继承于哪个父类
    ME:python如何判断某个方法是继承于哪个父类?给个能直接用的示例,能够自动遍历多层父类GPT:在Python中,可以通过使用内置函数inspect.getmro()来获取一个类的方法解......
  • Python strip()方法
    描述Pythonstrip()方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。语法strip()方......
  • 自动化测试环境的搭建 及 识别元素的方法
     自动化测试环境的搭建:一、安装selenium:安装方式一:       pipinstall-Uselenium 安装方式二:   手动安装selenium:   ......
  • 目标跟踪专栏(一)基本任务、常用方法
    前言 视觉目标跟踪是计算机领域的一个重要问题。尽管近年来受到了广泛研究,目标跟踪问题由于本身的高难度、高质量数据的稀少,研究热度比目标检测、语义分割等基本视觉任务......
  • JS_0075:判断方法是否含有参数,并做处理 hasOwnProperty
    functionmakeTextSprite(message,parameters){if(parameters===undefined)parameters={}letfontface=parameters.hasOwnP......
  • 工厂方法模式
    定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。结构:工厂方法模式的主要角色:抽象工厂(AbstractFactory......
  • python-字符串相关方法
    一、访问字符串中的值1、根据下标获取元素#根据下标获取字符word="hello"print(word[2])#输出l2、切片式范围截取#方括号内输入下标范围,截取字符串;word=......
  • PowerDesigner中几个常见问题的解决方法
    1.生成的字段或者表名英文字母默认全为大写,在实际使用中一般是小写:  2.模型中显示“Name”或“Code”,如何切换? 3.去掉生成表中加上的双引号"" ......
  • 知识蒸馏、轻量化模型架构、剪枝…几种深度学习模型压缩方法
    摘要:模型压缩算法旨在将一个大模型转化为一个精简的小模型。工业界的模型压缩方法有:知识蒸馏、轻量化模型架构、剪枝、量化。本文分享自华为云社区《深度学习模型压缩方法......