1.JUC概述
感谢秦疆老师的JUC并发编程视频,更多了解哔哩哔哩搜索【狂神说Java】。
本文内容源于秦疆老师的JUC并发编程视频内容。给狂神推荐,点赞吧!
1.什么是JUC
- java.util.concurrent 在并发编程中使用的工具类
- 在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于线程的自定义子 系统,包括线程池、异步 IO 和轻量级任务框架。 提供可调的、灵活的线程池。还提供了设计用于 多线程上下文中的 Collection 实现等。
java.util工具包
业务:普通的线程代码 Thread
Runnable 没有返回值、效率相比入 Callable 相对较低!
2. 线程和进程
进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
进程:一个程序,QQ.exe Music.exe 程序的集合;
一个进程往往可以包含多个线程,至少包含一个!
线程: 开了一个进程 Typora 写字,自动保存(线程负责的)
java默认有几个线程?
2个
- main线程
- GC线程
java真的能开启线程吗? 不能!
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++,Java方法无法直接操作硬件
private native void start0();
并发,并行
并发编程:并发、并行
并发:(多线程操作同一个资源)
- CPU一核,模拟出来多条线程,天下武功,唯快不破,快速交替
并行:(多个人一起行走)
- CPU多核,多个线程可以同时执行;线程池
package demo1;
public class Demo1 {
public static void main(String[] args) {
//获取cpu的核数
System.out.println(Runtime.getRuntime().availableProcessors());
}
}
并发编程的本质:充分利用CPU的资源!
线程有几个状态?
Thread.State
public enum State {
//新生
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待(死死的等待)
WAITING,
//超时等待(过期不候)
TIMED_WAITING,
//终止
TERMINATED;
}
- NEW :线程刚刚创建还没有启动
- RUNNABLE: 触发了start方法,线程正式启动
- BLOCKED: 线程阻塞,等待获取锁,获取到了锁则进行RUNNING状态继续运行
- WAITING:表示线程进行无限制等待状态,需要唤醒,需要notify/notifyall等 join需要等待目标线程完成后继续执行,一旦条件满足则进行RUNNING状态继续运行
- TIMED_WAITING: 线程进入了一个有限时的等待,如sleep(3000),等待3秒后线程重新进行运行状态
- TERMINATED: 表示线程结束进入终止状态
wait和sleep的区别(都能使线程处于阻塞状态)
-
来自不同的类 sleep是线程方法,wait是Object方法
wait->Object
sleep->Thread
-
关于锁的释放 sleep不释放lock,wait会释放
wait会释放锁,sleep睡觉了,抱着锁睡,不会释放
-
使用的范围是不同的 sleep不依赖同步方法,wait需要
wait必须在同步代码块中,sleep可以在任何地方
-
是否需要捕获异常 ?
wait 不需要捕获异常 sleep 必须要捕获异常
额,貌似都有InterruptedException 线程中断异常