Java多线程与并发编程全面解析:从基础到高级实践 一、Java多线程基础类1.1 核心线程类Java多线程编程的核心类主要包括Thread线程类继承Thread类并重写run()方法Runnable函数式接口实现run()方法无返回值Callable函数式接口实现call()方法有返回值Future异步计算结果接口用于获取Callable的返回值1.2 线程状态Java线程的生命周期包含6种状态NEW新建状态线程对象已创建但未启动RUNNABLE可运行状态包括就绪和运行中BLOCKED阻塞状态等待获取监视器锁WAITING无限期等待需要其他线程显式唤醒TIMED_WAITING限期等待超时后自动唤醒TERMINATED终止状态线程执行完毕二、线程池核心机制2.1 ThreadPoolExecutorJava线程池的核心实现类提供灵活的线程池配置ThreadPoolExecutor executor new ThreadPoolExecutor( corePoolSize, // 核心线程数 maximumPoolSize, // 最大线程数 keepAliveTime, // 空闲线程存活时间 TimeUnit.SECONDS, // 时间单位 workQueue, // 阻塞队列 threadFactory, // 线程工厂 handler // 拒绝策略 );2.2 Executors工具类Executors提供了4种常用的线程池创建方法newFixedThreadPool固定大小线程池newCachedThreadPool可缓存线程池自动回收空闲线程newSingleThreadExecutor单线程线程池newScheduledThreadPool定时任务线程池2.3 ForkJoinPool专为分治任务设计的线程池适用于CPU密集型并行计算ForkJoinPool pool new ForkJoinPool(); RecursiveTaskInteger task new MyRecursiveTask(data); Integer result pool.invoke(task);2.4 线程池状态RUNNING正常运行接受新任务并处理队列任务SHUTDOWN关闭状态不再接受新任务继续处理队列任务STOP停止状态不再接受新任务不处理队列任务中断正在执行的任务TIDYING整理状态所有任务已终止workerCount为0TERMINATED终止状态terminated()方法已执行完成2.5 线程池参数详解核心参数核心线程数corePoolSize线程池保持的最小线程数最大线程数maximumPoolSize线程池允许的最大线程数存活时间keepAliveTime非核心线程空闲时的存活时间阻塞队列类型ArrayBlockingQueue基于数组的有界阻塞队列LinkedBlockingQueue基于链表的可选有界阻塞队列DelayQueue基于优先级的延迟队列元素按到期时间排序拒绝策略AbortPolicy默认策略直接抛出RejectedExecutionException异常CallerRunsPolicy由调用者线程执行被拒绝的任务DiscardPolicy直接丢弃被拒绝的任务不抛异常DiscardOldestPolicy丢弃队列中最旧的任务然后尝试重新提交当前任务2.6 线程池执行流程提交任务到线程池如果当前线程数小于核心线程数创建新线程执行任务如果线程数达到核心线程数将任务放入阻塞队列如果队列已满且线程数小于最大线程数创建新线程执行任务如果队列已满且线程数达到最大线程数执行拒绝策略三、线程协作方式3.1 Object类方法必须在synchronized同步块中使用wait()使当前线程等待释放对象锁notify()随机唤醒一个等待该对象锁的线程notifyAll()唤醒所有等待该对象锁的线程3.2 Thread类方法sleep(long millis)使当前线程休眠指定毫秒数不释放锁join()等待目标线程执行完毕yield()提示调度器当前线程愿意让出CPU3.3 ReentrantLock的Condition提供更灵活的线程等待/通知机制ReentrantLock lock new ReentrantLock(); Condition condition lock.newCondition(); lock.lock(); try { condition.await(); // 等待 condition.signal(); // 唤醒一个 condition.signalAll(); // 唤醒所有 } finally { lock.unlock(); }四、锁机制4.1 synchronized关键字Java内置的同步锁基于对象监视器实现// 同步方法 public synchronized void method() { } // 同步代码块 synchronized (obj) { // 临界区代码 }4.2 AQSAbstractQueuedSynchronizer构建锁和同步器的框架核心实现包括ReentrantLock可重入独占锁ReentrantReadWriteLock读写锁支持读读并发4.3 CASCompare And Swap无锁编程的核心技术通过Unsafe类直接操作内存// 原子更新操作 AtomicInteger atomicInt new AtomicInteger(0); atomicInt.compareAndSet(0, 1); // 比较并交换五、并发协作工具类5.1 CountDownLatch计数器等待多个线程完成CountDownLatch latch new CountDownLatch(3); // 多个线程执行latch.countDown() latch.await(); // 等待计数器归零5.2 CyclicBarrier循环屏障让一组线程相互等待直到所有线程都到达屏障点CyclicBarrier barrier new CyclicBarrier(3, () - { System.out.println(所有线程已到达屏障开始执行后续任务); }); // 线程执行逻辑 Runnable task () - { try { // 执行前置任务 System.out.println(Thread.currentThread().getName() 到达屏障); barrier.await(); // 等待其他线程 // 所有线程到达后继续执行 } catch (Exception e) { e.printStackTrace(); } };CyclicBarrier 与 CountDownLatch 对比对比维度CountDownLatchCyclicBarrier核心功能等待一组线程完成各自任务让一组线程相互等待到达屏障点后继续计数器单向递减不可重置可循环使用到达屏障后自动重置重用性一次性使用计数器归零后失效可重复使用支持多轮屏障等待方式主线程等待工作线程完成工作线程相互等待典型场景启动服务等待依赖初始化完成多阶段并行计算如多线程数据分片处理异常处理countDown()不受异常影响await()抛出BrokenBarrierException使用建议CountDownLatch适用于一个或多个线程等待其他线程完成特定操作的场景如服务启动、资源初始化等。CyclicBarrier适用于多个线程需要相互等待然后同时开始下一阶段任务的场景如并行计算、多阶段数据处理等。5.2 Semaphore信号量控制并发访问数量Semaphore semaphore new Semaphore(5); // 允许5个并发 semaphore.acquire(); // 获取许可 // 执行临界区代码 semaphore.release(); // 释放许可六、原子操作类AtomicInteger原子整型AtomicLong原子长整型AtomicStampedReference带版本号的原子引用解决ABA问题七、异步编程7.1 Future接口表示异步计算的结果ExecutorService executor Executors.newSingleThreadExecutor(); FutureString future executor.submit(() - result); String result future.get(); // 阻塞获取结果7.2 CompletableFuture更强大的异步编程工具支持链式调用和组合操作CompletableFutureString future CompletableFuture.supplyAsync(() - Hello) .thenApply(s - s World) .thenAccept(System.out::println);八、并发集合8.1 ConcurrentHashMap线程安全的HashMap实现数据结构数组 链表 红黑树锁机制头结点锁CAS synchronized分段锁优化提高并发性能8.2 CopyOnWriteArrayList写时复制的线程安全List读操作无锁直接读取原数组写操作加锁ReentrantLock复制新数组适用场景读多写少的并发场景九、总结Java多线程与并发编程是Java高级开发的核心技能。掌握线程基础、线程池机制、锁原理、并发工具类和异步编程能够帮助开发者编写高效、安全的并发程序。在实际开发中应根据具体场景选择合适的并发工具和策略平衡性能与复杂度。