任何事物都有一个生命周期,线程也不例外。要想控制线程的生命,先得了解线程产生和消亡的整个过程。请读者结合前面讲的内容,请观察下图:
控制线程生命周期的方法有多种,如suspend()方法、resume()方法和stop()方法。但是这3个方法都不推荐使用,特别是suspend和resume方法尽量慎用,原因是它们很可能导致发生死锁。
虽然stop()能够避免死锁的发生,但是也有其不足之处。如果一个线程正在操作共享数据段,操作过程没有完成就 “stop()”了的话,将会导致数据的不完整,因此对stop()方法也不推荐使用。既然对这3个方法都不推荐使用,那么到底该使用什么方法控制线程的生命周期?请看下面的代码:
package com.xy.thread;
class ThreadDemo8 implements Runnable {
private boolean bFlag = true;
public void stopMe() {
bFlag = false;
}
public void run() {
while(bFlag) {
System.out.println(Thread.currentThread().getName() + "在运行!");
}
}
}
public class ThreadLife {
public static void main(String[] args) {
ThreadDemo8 t = new ThreadDemo8();
new Thread(t).start();
for(int i = 0; i < 10; i++) {
if(i == 5) {
t.stopMe();
}
System.out.println("mani线程正在运行!");
}
}
}
【结果】
本程序中定义了一个计数器 i ,用来控制main线程的循环打印次数。在i的值从0到4的这段时间内,这两个线程是交替运行的,但当计数器i的取值变为5的时候,程序调用了TestThread类的stopMe()方法,而在stopMe()方法中,将布尔变量bFlag赋值为false,也就是终止了while循环,run方法结束,Thread-0线程随之结束。main线程在计数器i等于5的时候,调用TestThread类的stopMe方法后,CPU不一定会马上切换到Thread-0线程上,也就是说Thread-0线程不一定会马上终止,main线程的计数器i可能还会继续累加,之后Thread-0线程才真正结束。
综上所述,通过控制run方法中循环条件的方式来结束一个线程的方法是值得推荐使用的方法,这也是实际中用的最多的方法。