一、isAlive方法
判定该线程是否处于就绪、运行或阻塞状态,如果是则返回true
处于新建或死亡状态,则返回false
1.例一
public class Test {
public static void main(String[] args) {
Thread thread = new Thread().currentThread();//主线程调用currentThread方法故返回的对象为主线程对象
System.out.println(thread.isAlive());//方法能执行到这说明主线程正在运行处于运行状态,故返回值是true
}
}
2.例二
public class Test {
public static void main(String[] args) {
Thread thread = Thread.currentThread();//主线程对象
new PrintThread(thread).start();//打印线程处于就绪状态,传入主线程对象
System.out.println("main线程状态:"+thread.isAlive());//主线程此时处于运行状态还活着,输出true
}
}
class PrintThread extends Thread{
private Thread thread;//定义了一个全局变量
public PrintThread(Thread thread){
this.thread = thread;//给全局变量赋值(赋值为主线程对象)
}
@Override
public void run() {
try {
sleep(1000);//阻塞了1s,这1s内主线程抢到CPU的资源,处于运行状态,主线程执行完后主线程死亡
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println("main线程状态:"+thread.isAlive());//此时主线程已经死亡,输出false
}
}
当打印线程阻塞时程序一定会先执行main方法中的输出语句,此时输出true;
当打印线程阻塞状态结束,此时输出false;
由此可见main方法中启动的线程可能晚于主线程结束;
3.例三
public class Watch {
String currentTime;//定义了一个全局变量
public static void main(String[] args) {//主线程
Watch watch = new Watch();//定义了一个普通类对象
TimeThread timeThread = watch.new TimeThread ();//新建了一个时间线程,由于TimeThread为内部类,要使用watch.new TimeThread ()方法新建线程
timeThread.start();//时间线程就绪
watch.new DisplayThread(timeThread).start();//创建了一个显示器线程调用start方法处于就绪状态,将时间线程对象传入
}
class DisplayThread extends Thread{
TimeThread timeThread;
public DisplayThread(TimeThread timeThread) {
this.timeThread = timeThread;//赋值为时间线程
}
@Override
public void run() {
System.out.println("时间线程状态:"+timeThread.isAlive());
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("时间线程状态:"+timeThread.isAlive());//显示器线程阻塞500毫秒,则时间线程“必死”
try {
timeThread.join();//显示器线程执行“已死”时间线程调用的jion方法,那么显示器线程会阻塞吗?
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(currentTime);
}
}
class TimeThread extends Thread{
@Override
public void run() {
currentTime = new java.util.Date().toString();
}
}
}
执行结果
显示器线程执行join方法,时间线程(已经死亡的线程)调用join方法,显示器线程不进入阻塞状态,因为显然时间线程已经处于死亡状态不会再进入就绪状态,因此显示器线程不用进入阻塞状态等待时间线程执行完才能进入就绪状态