一)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。
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!