1、今天学了什么
1、线程休眠
(1)sleep()
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态(Timed_Waiting),则可以通过调用Thread类的静态sleep()方法来实现。
static void sleep(long millis):让当前正在执行的线程暂停millis毫秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度与准确度的影响。
static void sleep(long millis,int nanos):让当前正在执行的线程暂停millis毫秒加nanos毫微秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度与准确度的影响。
当前线程调用 sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行。
/**
* sleep()方法练习
*/
public class SleepDemo1 {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
while(true){
System.out.println(true);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
//t1不调用start()方法 只调用run()方法时
//此时只有main线程运行 调用sleep()休眠的是mian线程
t1.run();
System.out.println("main线程休眠");
}
}
/**
* sleep()方法练习
*/
public class SleepDemo2 {
public static void main(String[] args) throws InterruptedException {
Thread t2 = new Thread(()->{
while(true){
System.out.println(true);
try {
//t2线程休眠 无法在休眠时间段内唤醒线程
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t2.start();
//休眠主线程 确保t2线程执行
TimeUnit.SECONDS.sleep(3);
//sleep()休眠后 t2线程的状态为TIME_WAITING
System.out.println(t2.getState());//TIMED_WAITING
}
}
/**
* sleep()方法练习
*/
public class SleepDemo3 {
public static void main(String[] args) throws InterruptedException {
Thread t3 = new Thread(()->{
while(true){
System.out.println(true);
}
});
t3.start();
//注意 sleep()是类方法 能使用创建对象的方式调用,但是不会有休眠效果,所以不能使用这种方式调用sleep()方法
t3.sleep(1000);
//休眠主线程 确保t2线程执行
TimeUnit.SECONDS.sleep(3);
//此时,t2线程不会被休眠
}
}
/**
* Interrupt()方法
*/
public class InterruptedDemo {
public static void main(String[] args) {
Thread t4 = new Thread(()->{
while (true){
System.out.println(true);
}
});
t4.start();
//调用interrupt()方法无法中断线程
//只能采用先标记线程中断
//然后通过Thread.interrupted();判断线程状态是否为中断状态
//若为true则通过抛异常的方式中断程序
t4.interrupt();
}
}