【尚硅谷】大厂必备技术之JUC并发编程2021新版_哔哩哔哩_bilibili
一、简介
JUC 就是 java.util.concurrent 工具包的简称。这是一个处理线程的工具包,JDK 1.5 开始出现的。
二、进程与线程
进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程是资源分配的最小单位。
线程:系统分配处理器实际资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程是程序执行的最小单元。
三、线程的状态
1. 线程状态枚举类
(1)NEW(新建)
(2)RUNNABLE(准备就绪)
(3)BLOCKED(阻塞)
(4)WAITING(不见不散)
(5)TIMED_WAITING(过时不候)
(6)TERMINATED(终结)
2. wait/sleep
(1)sleep 是 Thread 的静态方法,wait 是 Object 的方法,任何对象实例都能调用。
(2)sleep 不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占用锁(即代码要在 synchronized 中)
(3)它们都可以被 interrupted 方法中断。
四、管程(锁)
定义:
指管理共享变量以及对共享变量操作的过程,让它们支持并发。翻译成 Java 领域的语言,就是管理类的状态变量,让这个类是线程安全的。
synchronized 关键字 和 wait()、notify()、notifyAll() 这三个方法是 Java 中实现管程技术的组成部分。
管程对应的英文是 Monitor,直译为“监视器”,而操作系统领域翻译为“管程”。
五、用户线程和守护线程
守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务。它独立于控制终端并且周期性地执行某种任务或等待某些发生的事件。比如垃圾回收机制、JIT 线程 都是守护线程。
与之对应的是用户线程,用户线程可以理解为是系统的工作线程,它会完成这个程序需要完成的业务操作。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束,系统可以退出。所以当系统只剩下守护线程的时候,java 虚拟机会自动退出。
在 Java 中有两种线程:用户线程和守护线程。
通过 Thread.setDaemon(false) 设置为用户线程
通过 Thread.setDaemon(true) 设置为守护线程
线程属性的设置要在线程启动之前,否则会报 IllegalThreadStateException 异常
如果不设置线程属性,那么默认为用户线程
主线程结束,子线程1 是用户线程,内部有死循环,一直处于运行状态。JVM 存活。
子线程为设置为守护线程,main 方法所在的主线程执行完毕后,JVM 结束。
当程序中所有的用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出。