在Java中进行多线程编程可以极大地提高程序的效率和响应性。以下是一个简要的Java多线程编程指南,涵盖了多线程的基础概念、创建方式、线程池的使用以及线程安全与同步机制。
多线程基础概念
- 线程与进程:进程是操作系统资源分配的基本单位,线程是CPU调度的最小单位。一个进程可以包含多个线程,线程间通信成本低于进程通信。
- 多线程核心价值:提升吞吐量、增强响应性、资源高效利用。
Java线程生命周期
Java线程的生命周期包括:新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)和终止(TERMINATED)。
线程创建与管理
基础创建方式
- 继承Thread类:
class MyThread extends Thread { public void run() { System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行"); } } public class ThreadExample { public static void main(String[] args) { MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.start(); t2.start(); } }
- 实现Runnable接口(推荐):
class MyRunnable implements Runnable { public void run() { System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行"); } } public class RunnableExample { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable()); Thread t2 = new Thread(new MyRunnable()); t1.start(); t2.start(); } }
- Callable+Future(带返回值):
ExecutorService executor = Executors.newSingleThreadExecutor(); Future
future = executor.submit(() -> { TimeUnit.SECONDS.sleep(1); return 42; }); System.out.println(future.get()); executor.shutdown();
线程池(ThreadPoolExecutor)
- 核心参数:
- corePoolSize:常驻线程数
- maximumPoolSize:最大线程数
- keepAliveTime:空闲线程存活时间
- TimeUnit:时间单位
- workQueue:任务队列(如ArrayBlockingQueue)
- threadFactory:线程创建工厂
- handler:拒绝策略
- 四种预定义线程池:
Executors.newCachedThreadPool()
:弹性线程池Executors.newFixedThreadPool(n)
:固定大小Executors.newSingleThreadExecutor()
:单线程串行Executors.newScheduledThreadPool(n)
:定时任务
线程安全与同步机制
线程安全问题根源
- 原子性破坏
- 可见性问题
- 有序性问题
同步解决方案
- synchronized关键字:实例锁、类锁、同步代码块、临界区代码
- ReentrantLock(更灵活):
private final ReentrantLock lock = new ReentrantLock(); public void method() { lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } }
- volatile关键字:保证可见性,禁止指令重排
- 原子类(AtomicXXX):如
AtomicInteger
并发工具类详解
- CountDownLatch:倒计时门闩
- CyclicBarrier:循环栅栏
- Semaphore:信号量
- Exchanger:交换器
以上是一个简要的Java多线程编程指南,涵盖了多线程的基础概念、创建方式、线程池的使用以及线程安全与同步机制。希望这些信息能帮助你更好地理解和实现Java多线程编程。