一 是什么?
package com.aaa.threaddemo; /* * 多线程中的sleep方法? * sleep 隶属于Thread的方法,顾名思义,让线程睡一会。 1 public static native void sleep(long millis) throws InterruptedException; 使用需要try catch,或者 声明一个异常,才能使用。 2 long 跟的时间单位是秒 3 会让线程进入阻塞状态 4 调用线程会【暂时让出指定时间】的执行权。让出CPU,但是监控状态依然保持着。 5 线程不会释放对象锁。 6 如果在睡眠期间其他线程调用了该线程的interrupt()方法中断了该线程,则该线程会在调用sleep方法的地方抛出InterruptedException异常而返回。 */ public class ThreadRun { public static void main(String[] args) throws InterruptedException { Thread1 thread1 = new Thread1(); thread1.start(); //在thread1 阻塞的情况下,让其中断,会抛出异常 java.lang.InterruptedException thread1.interrupt(); } } class Thread1 extends Thread{ @Override public void run() { try { System.out.println("1111"); // 让子线程休息一秒, 在一秒内线程让出CPU,此时thread1 进入阻塞状态。 // 一秒后函数正常返回,参与CPU的调度。获取到CPU资源进入到运行状态。 Thread1.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
二 验证sleep,监控状态依然保持。 原文 https://zhuanlan.zhihu.com/p/259158177
package com.aaa.threaddemo;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
* 多线程中的sleep方法?
* sleep 隶属于Thread的方法,顾名思义,让线程睡一会。
1 public static native void sleep(long millis) throws InterruptedException; 使用需要try catch,或者 声明一个异常,才能使用。
2 long 跟的时间单位是秒
3 会让线程进入阻塞状态
4 调用线程会【暂时让出指定时间】的执行权。让出CPU,但是监控状态依然保持着。
5 线程不会释放对象锁。
6 如果在睡眠期间其他线程调用了该线程的interrupt()方法中断了该线程,则该线程会在调用sleep方法的地方抛出InterruptedException异常而返回。
*/
public class ThreadRun {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new Runnable() {
public void run() {
//创建独占锁
lock.lock();
try {
System.out.println("线程1开始睡觉");
Thread.sleep(1000);
System.out.println("线程1结束睡觉");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//解除锁
lock.unlock();
}
}
});
Thread thread2 = new Thread(new Runnable() {
public void run() {
//创建独占锁
lock.lock();
try {
System.out.println("线程2开始睡觉");
Thread.sleep(2000);
System.out.println("线程2结束睡觉");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
});
thread1.start();
thread2.start();
}
}