知道的越多,不知道的就越多。自己哪里薄弱,害怕哪里被问到,就要去补哪里。所以又回过头来学习下JUC并发编程。跟着B站狂神学习并记录。
什么是JUC
学之前感觉这是什么高级东西呢,其实JUC就是java提供的一个并发编程的工具包java.util.concurrent
。
还记得线程的几种实现方式吗?(不知道的点这里)其中有一种实现Callable
接口,Callable就是JUC下的一个接口。
回顾线程和进程
“进程是资源分配的最小单位,线程是CPU调度的最小单位”。一个进程往往可以包含多个线程,至少包含一个!
Java默认有2 个线程:
mian线程:是用户线程,java程序的入口,jvm必须确保用户线程执行完毕。
GC线程:是守护线程(daemon),负责jvm垃圾的回收,顾名思义守护我们程序的线程,jvm不用等待守护线程执行完毕。
java可以开启线程吗
曾经面试被问到过这个问题,其实java本质是开启不了线程的,所见的start方法并非真正的start。进入java start方法源码中可以看到,其实底层调的是native方法,要知道java是无法直接操作硬件的。
public synchronized void start() {
if (threadStatus != 0) throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0(); //可以看到在这里调了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++ ,Java 无法直接操作硬件
private native void start0();
并发和并行
并发编程的本质就是充分利用CPU的资源
并发:(多线程操作同一个资源)
CPU 一核 ,模拟出来多条线程,cpe调度快速交替执行
并行:(多个人一起行走)
CPU 多核 ,多个线程可以同时执行
查看cpu核数:Runtime.getRuntime().availableProcessors()
线程的生命周期(面试常问)
线程的生命周期一共分为五个部分分别是:新建,就绪,运行,阻塞以及死亡。但是在java中定义了六个状态:
public enum State {
// 新生
NEW,
// 运行
RUNNABLE,
// 阻塞
BLOCKED,
// 等待,死死地等
WAITING,
// 超时等待
TIMED_WAITING,
// 终止,死亡
TERMINATED;
}
wait/sleep 区别(面试常问)
1、来自不同的类
wait 是 Object类中的方法
sleep 是 Thread 类中的方法
2、关于锁的释放
wait 会释放锁,sleep 顾名思义睡觉了,抱着锁睡觉,不会释放!
3、使用的范围是不同的
wait必须在同步代码块中调用
sleep可以再任何地方睡