Java 多线程超详细整理,从入门到精通 多线程是 Java 并发编程核心内容程序异步处理、高并发场景都依赖多线程实现。本文围绕进程线程概念、三种创建线程方式、线程常用 API、线程安全与同步锁、线程池、自定义线程池七大模块完整讲解搭配卖票实战案例、完整可运行代码、表格汇总、开发规范与面试考点适合零基础自学、期末复习、面试查漏补缺。一、进程和线程1.1 进程概述进程是程序在数据集合上的一次运行活动操作系统资源分配最小单位简单理解电脑中运行的软件程序。进程三大特性独立性每个进程拥有独立内存空间无法直接访问其他进程数据动态性进程动态创建、运行、销毁并发性多个进程可同时交替运行。1.2 并发与并行区分并发单 CPU 核心多个任务交替执行宏观同时、微观串行并行多 CPU 多核多个任务同一时刻真正同时执行。1.3 线程概述线程是进程内部独立子任务进程内调度执行最小单位一个进程至少包含 1 个主线程多个线程共享进程资源。多线程优势充分利用 CPU 多核提升程序执行效率同一程序可同时处理多个独立任务如下载 浏览。1.4 小结进程软件运行实例分配内存资源线程进程内执行任务调度单位并发交替执行并行多核同时执行多线程提高程序运行效率。二、Java 开启线程的三种方式2.1 三种实现方式对比继承Thread类无返回值单继承有局限实现Runnable接口无返回值推荐支持多实现、资源共享实现Callable接口有返回值搭配 FutureTask 获取线程执行结果。2.2 方式 1继承 Thread 类public class MyThread extends Thread { Override public void run() { // 线程执行逻辑 System.out.println(子线程运行); } public static void main(String[] args) { MyThread t new MyThread(); t.start(); // 开启线程不能直接调用run() } }注意调用start()才会创建新线程直接调用 run 只是普通方法。2.3 方式 2实现 Runnable 接口推荐public class TicketTask implements Runnable{ int ticket 100; Override public void run() { while(true){ if(ticket 0) break; System.out.println(Thread.currentThread().getName()卖出ticket); ticket--; } } public static void main(String[] args) { TicketTask task new TicketTask(); new Thread(task,窗口1).start(); new Thread(task,窗口2).start(); new Thread(task,窗口3).start(); } }优势避免单继承限制多个线程共用同一个任务对象共享资源。2.4 方式 3实现 Callable带返回值适用于线程执行后需要拿到运算结果场景配合FutureTask包装任务交给 Thread。2.5 小结开发优先使用 Runnable无返回简单任务用 Thread需要线程结果使用 Callable。三、线程相关方法3.1 常用 API 表格方法名称说明String getName()获取线程名称void setName(String name)设置线程名构造方法也可传参命名static Thread currentThread()获取当前正在执行的线程对象static void sleep(long ms)线程休眠暂停指定毫秒抛出异常setPriority(int)设置线程优先级范围 1~5~10默认 5int getPriority()获取当前线程优先级setDaemon(boolean)设置为守护线程后台线程3.2 线程调度方式抢占式调度Java 采用CPU 优先执行高优先级线程同优先级随机分配时间片非抢占式线程主动让出 CPUJava 不使用。3.3 重点方法说明sleep阻塞线程时间结束自动就绪优先级仅代表获取 CPU 概率无法保证绝对顺序守护线程主线程结束后守护线程自动销毁如 GC 垃圾回收线程。3.4 小结currentThread 获取当前线程sleep 休眠优先级影响调度概率守护线程随主线程退出。四、线程安全和同步4.1 线程安全产生三大条件多线程同时运行存在共享资源多条语句操作共享变量。卖票案例问题多窗口同时访问 ticket出现重复出票、负数票。4.2 三种同步解决方案4.2.1 同步代码块语法synchronized(锁对象){ 多条操作共享数据代码 }要求多个线程必须使用同一个锁对象任意时刻仅一个线程进入代码块。4.2.2 同步方法方法上加synchronized修饰非静态同步方法锁对象为this静态同步方法锁对象为当前类字节码对象类名.class。4.2.3 Lock 锁ReentrantLock手动加锁、手动释放可读性更强Lock lock new ReentrantLock(); lock.lock(); // 上锁 try{ // 操作共享资源 }finally{ lock.unlock(); // 必须释放锁放在finally防止死锁 }4.3 同步优缺点优点解决多线程数据安全问题缺点同一时间单线程执行程序运行效率下降。4.4 小结多线程共享变量会出现并发安全同步代码块 / 同步方法 / Lock 三种锁机制Lock 手动控制锁更灵活。五、线程池介绍5.1 线程池出现原因频繁创建、销毁线程消耗大量操作系统资源大量短时线程容易内存溢出。线程池提前缓存线程复用线程对象减少开销、控制并发数量。5.2 线程池核心优势复用线程减少创建销毁开销控制并发线程总数防止 CPU / 内存耗尽统一管理线程方便监控。5.3 JDK 内置 Executors 快捷创建开发不推荐静态方法作用newCachedThreadPool无上限弹性线程池任务多会创建大量线程易 OOMnewFixedThreadPool固定最大线程池队列无上限堆积任务内存溢出阿里开发规范禁止直接使用 Executors 创建线程池必须手动ThreadPoolExecutor自定义。5.4 小结线程池复用线程提升性能Executors 工具类存在 OOM 风险生产环境不用。六、自定义线程池 ThreadPoolExecutor6.1 七参完整构造器public ThreadPoolExecutor( int corePoolSize, // 核心线程数正式员工 int maximumPoolSize, // 最大线程数核心临时线程 long keepAliveTime, // 临时线程空闲存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 任务阻塞队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )6.2 参数详解corePoolSize常驻核心线程无任务也不销毁maximumPoolSize最大并发线程keepAliveTime临时线程空闲多久自动销毁workQueue存放等待执行的任务handler核心 临时线程 队列全部占满触发拒绝策略。6.3 四大拒绝策略策略说明AbortPolicy默认直接抛出异常阻断任务提交DiscardPolicy静默丢弃最新任务无报错DiscardOldestPolicy丢弃队列等待最久任务存入新任务CallerRunsPolicy提交任务的主线程执行该任务6.4 线程池任务执行流程任务数 ≤ 核心线程直接分配核心线程执行核心线程已满任务放入阻塞队列排队队列已满创建临时线程直到达到最大线程数总线程 队列全部占满执行拒绝策略。6.5 小结自定义线程池七个参数各司其职掌握任务执行流程与四种拒绝策略企业开发标准写法。七、全文总结进程是资源单位线程是调度单位并发交替、并行同时创建线程三种方式Thread、Runnable推荐、Callable 带返回值线程 API命名、休眠、优先级、守护线程多线程共享变量存在安全问题三种同步锁同步代码块、同步方法、Lock线程池复用线程降低开销Executors 存在内存溢出隐患ThreadPoolExecutor 七参自定义线程池掌握任务执行流程与拒绝策略。拓展学习建议不加锁、加同步锁分别运行卖票案例直观观察线程安全问题手写三种创建线程完整代码区分有无返回值场景自定义线程池模拟任务过载测试四种拒绝策略效果练习线程休眠、守护线程、优先级代码加深理解。入门面试高频考点进程和线程区别、并发并行区别创建线程三种方式优缺点线程安全问题产生条件三种同步锁区别Lock 与 synchronized 对比线程池作用Executors 弊端自定义线程池七大参数线程池任务执行流程、四种拒绝策略。