1、什么是JUC
JUC 是 Java 并发编程中使用的工具类,包含java.util.concurrent
、java.util.concurrent.atomic
和java.util.concurrent.locks
。
2、进程和线程回顾
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
使用QQ,查看进程一定有一个QQ.exe的进程,我可以用qq和A文字聊天,和B视频聊天,给C传文件,给D发一段语言,QQ支持录入信息的搜索。大四的时候写论文,用word写论文,同时用QQ音乐放音乐,同时用QQ聊天,多个进程。word如没有保存,停电关机,再通电后打开word可以恢复之前未保存的文档,word也会检查你的拼写,两个线程:容灾备份,语法检查 。
3、线程由谁开启
Java 是无法创建线程的,本质上是 JVM 调用了本地方法来创建线程。
4、线程的状态
这里指的是 Java 定义的线程的状态,Java 提供了一个枚举类型定义线程的状态:
public enum State {
NEW, // 尚未启动的线程的线程状态
RUNNABLE, // 可运行线程的线程状态
BLOCKED, // 等待监视器锁而被阻塞的线程的线程状态。
WAITING, // 等待线程的线程状态
TIMED_WAITING, // 具有指定等待时间的等待线程的线程状态
TERMINATED; // 终止线程的线程状态
}
NEW:尚未启动的线程的线程状态;
RUNNABLE:一个处于可运行状态的线程正在Java虚拟机中执行,但是它可能正在等待来自操作系统(如处理器)的其他资源;
BLOCKED:处于阻塞状态的线程正在等待监视器锁进入一个同步的块/方法,或者在调用后重新进入一个同步的块/方法;
WAITING:线程处于等待状态是由于调用了以下方法之一:
1、Object.wait()
2、Thread.join()
3、LockSupport.park()
处于等待状态的线程正在等待另一个线程执行特定的操作。比如:
1、一个线程调用了一个对象的Object.wait()
方法则进入 WAITING 状态,等待其他线程调用这个对象的Object.notify()
方法或者Object.notifyAll()()
方法;
2、一个线程调用了Thread.join()
方法则进入 WAITING 状态,等待某个特定线程进入 TERMINATED 状态。
TIMED_WAITING:一个线程处于定时等待状态,这是由于调用了以下方法中的一种,具有指定的正等待时间:
1、Thread.sleep()
2、Object.wait()
并设置了等待时间
3、Thread.join()
并设置了等待时间
4、LockSupport.parkNanos
5、LockSupport.parkUntil
TERMINATED:线程已完成执行。
5、wait和sleep的区别
wait/sleep功能都是当前线程暂停,有什么区别?
wait:放开手去睡,放开手里的锁。
sleep:握紧手去睡,醒了手里还有锁。
可以这样记:wait 把锁给别人了,自己在这等;sleep 自己睡着了,锁没给别人。
6、并发和并行
并发:同一时刻多个线程在访问同一个资源,多个线程对一个点
CPU 一核 ,模拟出来多条线程,天下武功,唯快不破,快速交替
例子:小米9今天上午10点,限量抢购 春运抢票 电商秒杀…
并行:多项工作一起执行,之后再汇总
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中
CPU 多核 ,多个线程可以同时执行; 线程池