线程的中断和守护
线程中断概述
线程的鲁莽关闭会导致资源无法释放,为了解决这个问题,JDK提供了一个interrupt()方法实现线程的中断。
interrupt()方法
为想要关闭的线程打上标记,将会抛出一个异常对象进入catch块中。
下面用一个案例展示interrupt()方法的使用:
首先创建一个实现Runnable接口的类,用于创建线程。
class RunnableDemo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
try {
Thread.sleep(1000);//指定休眠1秒
} catch (InterruptedException e) {
System.out.println("发现中断标记,但未做任何处理");
}
}
}
}
接着在程序运行入口代码如下:
public static void main(String[] args) throws InterruptedException {
//子线程开启
Thread t1 = new Thread(new RunnableDemo());
t1.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(1000);
}
//给线程t1添加中断标记
t1.interrupt();
}
运行结果如下:
main:0
Thread-0:0
main:1
Thread-0:1
Thread-0:2
main:2
Thread-0:3
main:3
Thread-0:4
main:4
Thread-0:5
发现中断标记,但未做任何处理
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
主线程中for循环执行完成后,才会调用interrupt()方法给子线程t1打上标记,打上标记后运行sleep()方法时会判断是否有中断标记,如果有则抛出异常对象到catch代码块中。如果有释放资源的需求,在catch代码块中添加"用于资源释放的代码"即可。
线程类型概述:
线程分为用户线程和守护线程。当一个进程中不包含任何用户线程时,进程结束。当最后一个用户线程结束时,所有守护线程自动结束。默认创建的线程为用户线程。
运行下面这段代码
public class ThredDemo {
public static void main(String[] args) throws InterruptedException {
//子线程开启
Thread t1 = new Thread(new RunnableDemo());
t1.start();
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(1000);
}
}
}
class RunnableDemo implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
try {
Thread.sleep(1000);//指定休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果如下:
Thread-0:0
main:0
main:1
Thread-0:1
main:2
Thread-0:2
Thread-0:3
main:3
Thread-0:4
main:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
我们会发现:
即时主线程死亡,子线程也不会结束。
现在我们使用setDaemon()方法将子线程对象t1设置为守护线程:
public static void main(String[] args) throws InterruptedException {
//子线程开启
Thread t1 = new Thread(new RunnableDemo());
t1.setDaemon(true);//将t1设置为守护线程
t1.start();
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
Thread.sleep(1000);
}
}
运行结果如下:
Thread-0:0
main:0
Thread-0:1
main:1
main:2
Thread-0:2
main:3
Thread-0:3
Thread-0:4
main:4
Thread-0:5
我们可以看出,设置守护线程后,主线程死亡,守护线程也死亡了。
浙公网安备 33010602011771号