

代码中创建的new Thread 对象的生命周期和内核中实际的线程的生命周期是不一定一样的.可能会出现Thread对象存在,但是内核中的线程不存在了这样的情况(但是不会出现Thread对象不存在,线程还存在这种).比如在调用start之前,内核中还没有创建线程呢~再比如线程的run执行完毕了,内核中的线程就无了,但是Thread对象仍然存在.
后台线程: 如果这个线程执行过程中,不能阻止进程结束,这样的线程就是"后台线程"(也叫做守护线程).
前台线程: 如果某个线程在执行的过程中,能够阻止进程结束,此时这个线程就是"前台线程"
一个经典的面试题: start 和 run 的差别
调用start,不一定非得是main线程调用,任何的线程都可以创建其他线程; 一个Thread对象,只能调用一次start,如果多次调用start就会出现问题(一个Thread对象,只能对应系统中的一个线程)
假如有两个线程: A 和 B, B 正在运行,A想让B结束.
其实核心就是A要想办法让B的run方法执行完毕,此时B就自然结束了.而不是说,B的run执行一半,A直接把B强制结束了.
Java 中,结束线程是一个更"温柔"的过程,不是直接粗暴的,主要就是怕,B的某个工作执行了一半被强制结束,此时B对应的结果数据是一个"半成品".不是我们想要的.
怎么用代码实现线程的终止呢?
答: interrupted
public static void main(String[] args) throws InterruptedException { Thread t = new Thread(() -> { // 先获取到线程的引用 Thread currentThread = Thread.currentThread(); while (!currentThread.isInterrupted()) { System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { return; } } }); t.start(); Thread.sleep(3000); // 在主线程中,控制t线程终止,设置标志位 t.interrupt(); } Thread类里有一个成员,就是interrupted ,它是boolean 类型的.初始情况下是false,未被终止.
需要注意的是:
为啥要这么做呢?
答: 给程序员更多的操作空间.
本文到这里就结束啦~