线程有一个状态的概念,Thread有一个方法用于获取线程的状态:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
- NEW:没有调用start的线程状态为NEW。
- TERMINATED:线程运行结束后状态为TERMINATED。
- RUNNABLE:调用start后线程在执行run方法且没有阻塞时状态为RUNNABLE,不过,RUNNABLE不代表CPU一定在执行该线程的代码,可能正在执行也可能在等待操作系统分配时间片,只是它没有在等待其他条件。
- BLOCKED、WAITING、TIMED_WAITING:都表示线程被阻塞了,在等待一些条件。
daemon线程
启动线程会启动一条单独的执行流,整个程序只有在所有线程都结束的时候才退出,但daemon线程是例外,当整个程序中剩下的都是daemon线程的时候,程序就会退出。
我们举个例子
import lombok.SneakyThrows;
/**
* @author wcfb
* @time 2021/5/15/015.
* @since
*/
public class StudentThread extends Thread {
@SneakyThrows
@Override
public void run() {
System.out.println("student: i am a student!");
for (int i = 0; i < 5; i++) {
sleep(1000);
System.out.println("student: i need to do homework." + i);
}
}
}
import lombok.SneakyThrows;
/**
* @author wcfb
* @time 2021/5/15/015.
* @since
*/
public class TeacherThread implements Runnable {
@SneakyThrows
@Override
public void run() {
System.out.println("teacher: i am a teacher!");
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);
System.out.println("teacher: i need work." + i);
}
}
}
/**
* @author wcfb
* @time 2021/5/15/015.
* @since
*/
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
Thread teacher = new Thread(new TeacherThread());
Thread student = new Thread(new StudentThread());
// teacher.setDaemon(true);
System.out.println("teacher is daemon " + teacher.isDaemon());
System.out.println("student is daemon " + student.isDaemon());
student.start();
teacher.start();
Thread.sleep(1000);
System.out.println("student is alive " + student.isAlive());
System.out.println("teacher is alive " + teacher.isAlive());
}
}
我们现将teacher.setDaemon(true); 这行注释掉。
查看一下执行结果
image.png
然后我们将注解打开执行一次
image.png
我们可以看到,当teacher如果是daemon时,不需要等到他全部执行完毕。
网友评论