目录
- 一、什么是JUC
- 二、进程和线程
- 1、进程
- 2、线程
- 三、线程的六种状态
- 四、wait与sleep的区别
- 五、并发与并行
- 1、串行模式
- 2、并行模式
- 3、并发模式
- 4、管程
- 六、用户线程与守护线程
- 1、用户线程(自定义线程)
- 2、守护线程(比如垃圾回收)
一、什么是JUC
JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!
二、进程和线程
一个进程中有多个线程
1、进程
进程是资源分配的最小单位
指在系统中正在运行的一个应用程序,程序一旦运行就是进程
2、线程
线程是程序执行的最小单位
系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流
三、线程的六种状态
public enum State {
// 新生
NEW,
// 运行
RUNNABLE,
// 阻塞
BLOCKED,
// 等待
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}
四、wait与sleep的区别
- sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用
- sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)
- 二者都可以被interrupted方法中断
五、并发与并行
并发:同一时刻多个线程在访问同一资源,多个线程对一个点
并行:多项工作一起执行,之后再汇总
1、串行模式
串行表示所有任务有一一按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这整个三个步骤,才能进行下一个步骤。
串行是一次只能取得一个任务,并执行这个任务
2、并行模式
并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。并行的效率从代码层次上强依赖于多线程/多线程代码,从硬件角度上则依赖于多核CPU
3、并发模式
并发指的是多个程序可以同时运行的现象,更细化的是多线程可以同时运行或者多指令可以同时运行
4、管程
管程(Monitor):在Java中称之为“锁”,在操作系统中称之为“监视器”。是一种同步机制,保证同一个时间,只有一个线程访问被保护的数据或者代码。
jvm同步基于进入和退出的过程中进行操作的,而进入和退出是使用管程对象实现的。每个对象都会有一个Monitor管程对象。而管程对象是会随着Java对象一起创建和销毁。
通俗来说的话就是:管程对象就是对我们的临界区进行加锁,进入时加锁,退出时解锁。进入退出通过管程对象进行管理
六、用户线程与守护线程
1、用户线程(自定义线程)
public static void main(String[] args) {
Thread thread = new Thread(() -> {
//isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
while (true) {
}
}, "thread");
thread.start();
System.out.println(Thread.currentThread().getName()+" over");
}
执行结果:主线程结束了,用户线程还在运行,说明jvm是存活的一个状态
2、守护线程(比如垃圾回收)
public static void main(String[] args) {
Thread thread = new Thread(() -> {
//isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
while (true) {
}
}, "thread");
//设置守护线程
//用户线程包括守护线程,在设置用户线程包括守护线程的时候,要写在start()方法之前
thread.setDaemon(true);
thread.start();
System.out.println(Thread.currentThread().getName()+" over");
}
执行结果:没有用户线程了,都是守护线程,说明jvm结束