线程休眠
线程休眠的目的是使线程让出CPU的使用权.当线程休眠时,会将CPU资源的使用交给其他线程,以便能够线程之间的轮换调用.当休眠一定时间后,线程就会苏醒,然后进入准备状态等待执行.
1、方法介绍
sleep(long millis) 线程睡眠 millis 毫秒
sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒
2、如何调用sleep
因为sleep()是静态方法,所以最好的调用方法就是 Thread.sleep()。
3、在哪里写sleep更合理?
线程的sleep方法应该写在线程的run()方法里,就能让对应的线程睡眠。如下面代码:
public class Thread1 {
public static void main(String[] args) {
Runner1 r1 = new Runner1();
Thread t = new Thread(r1);
t.start();
for (int i = 0; i < 3; i++) {
System.out.println("main thread :"+i);
}
}
}
class Runner1 implements Runnable{
@Override
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 3; i++) {
System.out.println("Runner1 : " + i);
}
}
}
结果:
main thread :0
main thread :1
main thread :2
----------------- 此处睡眠5秒,5秒后出现以下:
Runner1 : 0
Runner1 : 1
Runner1 : 2
4、到底是让哪个线程睡眠?
结论:sleep方法只能让当前线程睡眠。调用某一个线程类的对象t.sleep(),睡眠的不是t,而是当前线程。
代码验证:为了验证,我们通过继承Thread类创建线程。在Runner1的run()中不写sleep(),在主线程中写Runner1.sleep(5000),结果不是Runner1睡眠,还是主线程睡眠,请看下面输出结果。
public class Thread1 {
public static void main(String[] args) {
Runner1 r = new Runner1();
r.start();
try {
Runner1.sleep(5000); //此处是类名.sleep()
System.out.println("当前运行的线程名称: "+ Runner1.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 3; i++) {
System.out.println("main thread :"+i);
}
}
}
class Runner1 extends Thread{
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println("Runner1 : " + i);
}
}
}
结果如下:
Runner1 : 0
Runner1 : 1
Runner1 : 2
--------------------------------- 此处睡眠5秒,5秒后出现以下:
当前运行的线程名称: main
main thread :0
main thread :1
main thread :2
---------------------
作者:cwangjie
来源:CSDN
原文:https://blog.csdn.net/cwangjie/article/details/80472851
版权声明:本文为博主原创文章,转载请附上博文链接!