1.什么是juc?
juc就是java.util.concurrent工具包的简称,这是处理线程的工具包,jdk1.5开始出现
2.什么是进程和线程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,在当代面向线程设计的计算机机构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程(thread)是操作系统能够进行运算调度的最小单位,他被包含在进程之中,是进程中实际运作单位。一条线程是指进程中一个单一顺序的控制流,一个进程可以并发多个线程,每条线程执行不同的任务。
3.线程的状态
- NEW(新建)尚未启动的线程处于此状态
- RUNNABLE(准备就绪)在Java虚拟机中执行的线程处于这种状态
- BLOCKED(阻塞)等待监视器锁定被阻止的线程处于此状态。
- WAITING(不见不散)无限期等待另一线程执行特定操作的线程处于此状态。
- TIMED_WAITING(过时不候)在指定等待时间内等待另一线程执行操作的线程处于此状态。
- TERMINATED(终结)已退出的线程处于此状态
4.wait和sleep
- sleep是Thread的静态方法,wait是Object的方法,任何对象都能调用
- sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)
- 他们都可以被interrupted方法中断
5.并发和并行
并发:同一个时刻多个线程在访问同一个资源,多个线程对一个点
例子:春运抢票 电商秒杀
并行:多项工作一起执行,之后在汇总
例子:泡方便面,电水壶烧水,一边撕调料导入桶中
6.管程
monitor 监视器 (即锁):是一种同步机制,保证同一个时间,只有一个线程访问和保护数据或者代码。
管程对象和java对象一同被创建,也和java对象一起消失,管程对象用于监视java对象。
7.用户线程和守护线程
用户线程:自定义线程
守护线程:比如垃圾回收
public class Main {
public static void main(String[] args) {
Thread aa = new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
while(true) {
}
}, "aa");
aa.start();
System.out.println(Thread.currentThread().getName()+"over");
}
}
运行结果,这个现象表示主线程已经结束,用户线程依然还是存在,因此jvm依然存活
之后我们将线程aa设置为守护线程
运行发现,jvm结束了,也就是如果没有用户线程守护线程就会结束