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

一)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。

 

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

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


版权声明:本文为p812438109原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。