上一篇:线程起名,分工有序 | 带你学《Java语言高级特性》之六
【本节目标】
通过阅读本节内容,你将学会使用sleep方法使线程休眠、使用interrupt方法强行中断线程,并掌握当线程被中断时处理中断异常的方法。
线程的休眠
如果希望某个线程可以暂缓执行,那么就可以使用休眠的处理,在Thread类中定义的休眠方法如下:
public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException
在进行休眠的时候有可能会产生中断异常“InterruptedException”,中断异常属于Exception的子类,所以该异常必须进行处理。
范例:观察休眠处理
public class ThreadDemo {
public static void main(String[] args) throws Exception {
new Thread(() -> {
for (int x = 0; x < 10; x++) {
try {
Thread.sleep(1000); //暂缓执行
}catch (InterruptedException e){
}
System.out.println(Thread.currentThread().getName() + "、x = " + x);
}
},"线程对象").start();
}
}
图一 休眠处理执行结果
休眠的主要特点是可以自动实现线程的唤醒,以继续进行后续的处理。但是需要注意的是,如果现在有多个线程对象,那么休眠也是有先后顺序的。
范例:产生多个线程对象进行休眠处理
public class ThreadDemo {
public static void main(String[] args) throws Exception {
Runnable run=() -> {
for (int x = 0; x < 10; x++) {
System.out.println(Thread.currentThread().getName() + "、x = " + x);
try {
Thread.sleep(1000); //暂缓执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
for (int num = 0; num < 5; num++) {
new Thread(run, "线程对象 - " + num).start();
}
}
}
图二 多线程休眠处理
此时将产生5个线程对象,并且这5个线程对象执行的方法体是相同的。此时从程序执行的感觉上好像是若干个线程一起进行了休眠,而后一起进行了自动唤醒,但是实际上是有差别的。
图三 多线程处理
线程中断
在之前发现线程的休眠提供有一个中断异常,实际上就证明线程的休眠是可以被打断的,而这种打断肯定是由其他线程完成的。在Thread类里面提供有这种中断执行的处理方法:
判断线程是否被中断:public boolean isInterrupted();
中断线程执行:public void interrupt();
范例:观察线程的中断处理操作
public class ThreadDemo {
public static void main(String[] args) throws Exception {
Thread thread = new Thread(() -> {
System.out.println("*** 72个小时的疯狂我需要睡觉补充精力。");
try {
Thread.sleep(10000); //预计准备休眠10秒
System.out.println("****** 睡足了,可以出去继续祸害别人了。");
} catch (InterruptedException e) {
System.out.println("不要打扰我睡觉,我会生气的。");
}
});
thread.start(); //开始睡
Thread.sleep(1000);
if (thread.isInterrupted()==false) { //该线程中断了吗?
System.out.println("我偷偷地打扰一下你的睡眠");
thread.interrupt(); //中断执行
}
}
}
所有正在执行的线程都是可以被中断的,中断的线程必须进行异常的处理。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学