一、线程的概念&生命周期
1. 什么是进程
百度百科:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
比如打开抖音 抖音就是一个进程
2. 什么是线程
是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程实际运作单位。一个进程由多个线程组成。
进程 腾讯视屏.exe 点击 启动
比如抖音给美女点赞,进程需要开一个线程去给点赞数+1
知识点:线程切换需要消耗系统资源 有兴趣可以了解一下协程/纤程 更小更快
3. 线程的生命周期
1. new: 刚创建线程 还没开始执行
2. Runnable: 调用start()方法之后 就会交给线程调度器执行了,归操作系统管了 这时候是Runnable
Runnable 可以分为两个状态:
2.1 Ready: 就绪状态 这个时候线程进了CPU的等待队列 等着CPU执行了
或者cpu执行了一半,又去执行别的线程了,当前线程被挂起、
或者执行Thread.yield() 方法 主动让出cpu 】
2.2 Running:** 运行状态 获取到了CPU的执行权限 开始执行
3. Blocked: 线程进入synchronized同步代码块中 然后没有获取到所资源的时候 就阻塞
4. Waiting: 调用wait join LockSuport.park() 等方法后 进入Waiting状态
需要notify、notifyAll、LockSuport.unpark() 才能逃离waiting状态
5. TimeWaiting: 与Waiting类似 只是加了时间 超过一定时间 自动逃离Waiting状态
6. Terminated: 线程结束 线程内容执行完了结束 Terminated状态之后不能再进入其他状态了

这个状态看一次会了,过段时间就忘了 所以呢想个办法 让它留在脑海
假如你(CPU)找了个对象(Thread)
你对象可能的状态有:
刚找到对象:New
对象洗白白钻被窝:Ready
你有空了被窝找对象:Running
对象要睡觉:TimeWaiting
你要洗澡,对象要去厕所 需要在门口waitting
你生气了把对象锁门外:对象处于Blocked状态 他没有要是进不来
4. 瞅一眼代码
//线程状态枚举 public enum State {NEW,RUNNABLE, // 可能是Ready 可能是 Running 看cpu调度了BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}
NEW:
Thread t1 = new Thread(()->{System.out.println("线程1");
});System.out.println("t1状态:"+t1.getState().name()); // NEW
RUNNABLE:
final Thread t1 = new Thread(()->{try {while (true){Thread.yield();}} catch (Exception e){}});t1.start();new Thread(()->{System.out.println("t1状态:"+t1.getState().name());}).start();
Waiting:
public static Object o = new Object();public static void main(String[] args) throws InterruptedException {final Thread t1 = new Thread(()->{try {synchronized (o){o.wait();}} catch (Exception e){}});t1.start();Thread.sleep(1000);new Thread(()->{System.out.println("t1状态:"+t1.getState().name());}).start(); // WAITING}
TIMED_WAITING:
public static Object o = new Object();public static void main(String[] args) throws InterruptedException {final Thread t1 = new Thread(()->{try {synchronized (o){o.wait(10000);}} catch (Exception e){}});t1.start();Thread.sleep(1000);new Thread(()->{System.out.println("t1状态:"+t1.getState().name());}).start();}
public static Object o = new Object();public static void main(String[] args) throws InterruptedException {final Thread t1 = new Thread(()->{try {Thread.sleep(1000);synchronized (o){}} catch (Exception e){}});t1.start();new Thread(()->{synchronized (o){try {Thread.sleep(2000);System.out.println("t1状态:"+t1.getState().name());//Blocked} catch (Exception e){e.printStackTrace();}}}).start();}