1.什么是JUC
- 在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的。
- 后续,juc也就成了并发的代名词,理解意思即可。
2.进程和线程
-
进程是正在运行的程序,是系统进行资源分配的基本单位 (一个程序:例如QQ.exe,Music.exe)
-
线程,又称轻量级进程(Light Weight Process)。是进程中的一条执行路径,也是CPU的基本调度单位。一个进程由一个或多个线程组成,彼此间完成不同的工作,同时执行(宏观并行,微观串行),称为多线程。(例如:迅雷是一个进程,当中的多个下载任务即是多个线程。)
-
进程和线程的区别:
- 进程是操作系统资源分配的基本单位,而线程是CPU的基本调度单位
- 一个程序运行后至少有一个进程。
- 一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义。
- 进程间不能共享数据段地址,但同进程的线程之间可以。
-
java默认有几个线程?2个线程! main线程、GC线程
-
对于Java而言:我们之前使用Thread、Runnable、Callable这三种方式来开启线程的
-
提问?JAVA真的可以开启线程吗? 开不了的!(来看一下 Thread().start()的源码)
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
//这是一个本地方法,底层的c++,在之前的jvm中提到过,Java是没有权限操作的
private native void start0();
3.并发与并行
-
并行:并行是针对多处理器(cpu)而言的。指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。(当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行)
-
并发:并发描述的是多个进程同时运行的现象(多个进程抢一个cpu)。但实际上,对于单核心CPU来说,同一时刻只能运行一个进程。在单个cpu中,从宏观的角度讲:多个进程是同时进行的,但是在微观的角度来看:只是cpu快速切换不同的进程,让其执行(CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行)
-
并发编程的本质:充分利用CPU的资源!
public class Test1 {
public static void main(String[] args) {
//获取cpu的核数
System.out.println(Runtime.getRuntime().availableProcessors());
}
}
4.线程的状态(六个)
- 看源码
public enum State {
//新生
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}