写点什么

话说 线程的概念 & 生命周期

发布于: 2021 年 04 月 05 日
话说  线程的概念&生命周期

一、线程的概念 &生命周期

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();}
复制代码


Blocked:


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();}
复制代码


欢迎关注公众号:


用户头像

还未添加个人签名 2018.03.28 加入

还未添加个人简介

评论

发布
暂无评论
话说  线程的概念&生命周期