Java多线程-sleep()线程休眠

本文详细介绍了Java中Thread.sleep()方法,包括其作用、使用方式和与wait()的区别。在介绍sleep()时,提到了线程的阻塞和就绪状态转换,以及在网页爬虫等场景的应用。此外,还探讨了sleep()的源码和异常处理。最后,对比了sleep()和wait()在释放锁、使用上下文以及中断处理上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一)sleep()简介

static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。

static void sleep(long millis, int nanos):使正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),具体取决于系统定时器和调度器的精度和准确性。

 

线程睡眠:当线程调用Thread.sleep(long millis)方式时,会使线程变为阻塞状态,以毫秒为单位。当线程结束睡眠时,会变为就绪状态,等待运行。

调用方式:当继承Thread实现多线程时,直接调用sleep(long millis)方法,其它情况都需要通过Thread.sleep(long millis)方式调用。

适用场景:当执行程序要求频率慢一点的场景。比如在做网页爬虫时,一些接口调用是有请求频率限制的,当调用接口太频繁或调用频率总是相同时,容易被封号,该场景可以适用sleep()随机休眠的方式一次次调用。

 

奇葩情况:如线程休眠获取下一天的时间,如睡眠算法等。

 

二)sleep()

jdk中sleep()源码:

public static void sleep(long millis, int nanos) throws InterruptedException {
    if (millis < 0) { // 当毫秒数小于0,就抛异常
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) { // 纳秒数超过该范围, 就抛异常
        throw new IllegalArgumentException("nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis); // 指定睡眠的毫秒数
}

 

sleep()案例:

public class MyRunnable implements Runnable {

    public void run(){
        synchronized (this) { // 代码块
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + ", i=" + i);
                try {
                    Thread.sleep((int)(Math.random()*1000)); // 随机睡眠几百毫秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        MyRunnable my = new MyRunnable();
        Thread t1 = new Thread(my);
        t1.start();
    }
}

运行结果:

说明:每一次循环打印之后,都随机睡眠几百毫秒,再继续执行。

 

三)sleep()和wait()的区别

1、sleep()的作用是让当前线程由“运行状态”进入到“休眠(阻塞)状态”,sleep()不会释放锁。

2、sleep()属于Thread类中的方法,必须捕获异常,并且sheep()方法可以在任意线程中使用。

3、wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”,会释放对象的同步锁。

4、wait()、notify()和notifyAll()属于Object类中的方法,不需要捕获异常,并且只能在synchronized同步块中使用。

5、wait()和sleep()都可以通过interrupt()中断这个线程方法,打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值