Java16 多线程知识点
2026/6/14 8:56:55 网站建设 项目流程

一、进程【理解】

1. 定义:操作系统(OS)中,每一个被执行的应用程序。

2. 特点:目前操作系统支持多进程并发执行任务。

3. 并发原理:微观上串行(一个一个进程轮流执行,获取CPU时间片的进程拥有执行权);宏观上并行(所有进程看似一起执行)。
二、线程

1. 概念:在一个进程中,并发执行的多个任务。线程是进程执行任务的单元,也被称为轻量级进程。

2. 主线程:程序默认的单线程,以main函数的开始为起点、结束为终点,默认执行main函数。

3. 线程的组成:

◦ CPU:获取到CPU时间片的线程拥有执行权

◦ 数据:栈空间独立(每个线程有独立的栈空间,存储局部变量);堆空间共享(多个线程可操作同一个堆空间,存储对象)

◦ 程序代码:线程执行的逻辑代码

4. 代码实现多线程【重点】

◦ 方式一:继承java.lang.Thread类
// 1. 继承Thread类,重写run()方法
class MyThread extends Thread{
@Override
public void run() {
// 线程执行的逻辑
}
}
// 2. 创建线程对象并启动
MyThread t1 = new MyThread();
t1.start(); // JVM自动调用run()方法
◦ 方式二:实现java.lang.Runnable接口
// 1. 实现Runnable接口,实现run()方法
class MyTarget implements Runnable{
@Override
public void run() {
// 线程执行的逻辑
}
}
// 2. 创建目标对象,传入Thread对象并启动
MyTarget mt = new MyTarget();
Thread t2 = new Thread(mt);
t2.start(); // JVM自动调用run()方法


三、线程状态【理解】

1. 线程状态流转:
New(初始状态) → 调用start() → Ready(就绪状态) → 获得CPU时间片 → Running(运行状态)
Running状态可进入:
- Terminated(终止状态):run()/main()方法执行完毕
- Blocked(阻塞状态):同步代码块获取锁失败
- Timed Waiting(限期等待):sleep(time)
- Waiting(无限期等待):join()/wait()
2. 常用方法:

◦ static void sleep(long ms):让当前线程进入休眠(限期等待),释放CPU但不释放锁标记

◦ void join():让其他线程优先执行,当前线程进入无限期等待(如主线程中调用t.join(),主线程等待t线程执行完毕再继续)
四、线程同步【重点】

1. 核心概念:

◦ 临界资源:多线程并发时被共享的同一个对象

◦ 原子操作:不可分割的多步操作,执行顺序和步骤不能被打破

◦ 线程同步:多线程并发访问时,保证临界资源的正确性,保护原子操作不被破坏

2. 同步方式:

◦ 同步代码块:对临界资源对象加锁
synchronized(临界资源对象){
// 原子操作
}
原理:线程获取锁标记后执行代码,执行完毕释放锁;获取锁失败则进入阻塞状态。

◦ 同步方法:用synchronized修饰方法
修饰符 synchronized 返回值类型 方法名(形参列表) throws 异常{
// 原子操作
}
等价于对当前对象加锁(synchronized(this))。
五、线程间的通信

1. 核心方法(定义在java.lang.Object类中):

◦ 等待:wait()

◦ 必须在同步代码块中调用

◦ 线程调用后进入无限期等待状态,释放锁标记和CPU

◦ 通知:notify()/notifyAll()

◦ notify():通知一个等待的线程结束等待

◦ notifyAll():通知所有等待的线程结束等待

◦ 注意:必须在同步代码块中调用,仅起到通知作用,不释放锁标记

2. 面试题:sleep(long ms)和wait()的区别

◦ sleep(long ms):线程进入限期等待,释放CPU但不释放锁标记

◦ wait():线程进入无限期等待,释放CPU同时释放锁标记
六、线程池【开发应用】

1. 概念:线程容器,预先创建线程存储在池中,线程可被重复使用。

2. 好处:减少创建和销毁线程的次数,提高执行效率。

3. 常用接口与工具类(位于java.util.concurrent包):

◦ Executor:线程池根接口

◦ ExecutorService:线程池常用子接口

◦ submit(Runnable r):提交Runnable任务

◦ submit(Callable<V> c):提交Callable任务

◦ shutdown():关闭线程池

◦ Executors:线程池工具类

◦ static ExecutorService newFixedThreadPool(int n):创建固定数量线程池

◦ static ExecutorService newCachedThreadPool():创建动态数量线程池
七、Callable接口(位于java.util.concurrent包)【开发应用】

1. 概念:JDK5.0新增,与Runnable类似,代表线程任务,支持返回值和抛出异常。

2. 核心方法:V call(),带有泛型返回值,可抛出任意类型异常。

3. 调用方式:

◦ 同步调用:调用者需等待被调用方法执行完毕再继续

◦ 异步调用:调用者无需等待,可直接执行后续逻辑

4. Future接口:接收异步计算结果,通过get()方法获取Callable任务的返回值。
八、常用集合补充

1. 队列(Queue):先进先出(FIFO)结构,是Collection的子接口。

◦ 常用方法:add()/offer()添加元素、poll()获取并移除队头元素

◦ 实现类:LinkedList、BlockingQueue(阻塞队列,如ArrayBlockingQueue、LinkedBlockingQueue)

2. 线程安全集合工具方法:Collections.synchronizedXXX()系列方法,将非线程安全集合转换为线程安全集合

3. 锁的应用:

◦ Lock接口:比synchronized更灵活,ReentrantLock是实现类,lock()获取锁、unlock()释放锁(建议在finally中释放)

◦ ReadWriteLock读写锁:支持读多写少场景,读读不互斥、读写/写读/写写互斥,提高读操作效率

4. 线程安全且高效的集合类:

◦ CopyOnWriteArrayList:写操作加锁并复制新数组,读写不互斥,读多写少场景效率高

◦ ConcurrentLinkedQueue:基于CAS算法实现的线程安全队列

◦ ConcurrentHashMap:分段锁(JDK7)/CAS+Synchronized(JDK8)实现,锁粒度小,并发效率高,不允许null键值

5. 多线程实现方式总结:

1. 继承Thread类,重写run()方法,调用start()启动

2. 实现Runnable接口,实现run()方法,传入Thread对象启动

3. 实现Callable接口,实现call()方法,借助线程池提交任务
补充:集合体系回顾(多线程相关)
Collection
├─ List(有序、有下标、元素可重复)
│ ├─ ArrayList(线程不安全)
│ ├─ Vector(线程安全)
│ └─ CopyOnWriteArrayList(线程安全,读多写少)
├─ Set(无序、无下标、元素不可重复)
│ ├─ HashSet
│ ├─ SortedSet → TreeSet
│ └─ LinkedHashSet
└─ Queue(先进先出)
├─ ConcurrentLinkedQueue
├─ LinkedList
└─ BlockingQueue → ArrayBlockingQueue/LinkedBlockingQueue
Map
├─ HashMap(线程不安全)
├─ Hashtable(线程安全)
├─ LinkedHashMap
├─ ConcurrentHashMap(线程安全)
└─ SortedMap → TreeMap

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询