Java JUC - 初识JUC
JUC
JUC是java.util.concurrent
工具包的简称,这是一个处理线程的工具包,出现于JDK1.5.
进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
摘自:百度百科
线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
摘自:百度百科
线程的状态
通过java.lang.Thread.State
,了解到,进程的状态有6:
NEW
新建RUNNABLE
可运行BLOCKED
阻塞WAITING
等待TIMED_WAITING
定时等待TERMINATED
已终止
sleep和wait
sleep
是Thread
的静态方法;wait
是Object
的方法,任何对象和实例都能调用。sleep
不会释放锁,它也不需要占用锁;wait
会释放锁,但调用它的前提是当前线程占有锁,并且在锁代码块里如:synchronized
中。- 它们都可以被
interrupted
方法中断。
并发与并行
串行模式
串行表示所有任务都一一按先后顺序进行,一次只能取得并执行一个任务,如:把大象放入冰箱要几个步骤。(玩笑)
并行模式
并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于多条流水线,每条流水线都各自执行自己的任务。
并行的效率从代码层次上强依赖于多进程/多线程代码,从硬件角度上则依赖于多核CPU。
并发
并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或多指令可以同时运行。同一时刻多个线程在访问同一个资源,多个线程对一个点。
管程
管程(monitor监视器)即“锁”,是一种同步机制,保证在同一时间内只有一个线程访问被保护的数据或者代码。
JVM同步基于使用管程对象实现的进入和退出
用户线程:自定义线程
final Thread customThread = new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());
while (true) {
}
}, "custom");
customThread.setDaemon(true);
customThread.start();
System.out.println(Thread.currentThread().getName() + "\t done");
控制台输出:
main done
custom false
通过执行上面代码,发现虽然主线程结束了,但是用户线程还在运行,所以整个JVM不会关闭。
守护线程:如垃圾回收
final Thread customThread = new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());
while (true) {
}
}, "custom");
customThread.setDaemon(true);
customThread.start();
System.out.println(Thread.currentThread().getName() + "\t done");
控制台输出:
main done
此时已经没有用户线程了,都是守护线程,主线程执行完毕后JVM也随之关闭。