第八天
一、核心概念:线程与进程的本质区别
在开始编码前,我们需厘清两个基础概念:
- 进程 (Process):操作系统进行资源分配的最小单位,包含了程序代码、数据空间等,一个进程可以包含多个线程。
- 线程 (Thread):CPU调度执行的最小单位,共享进程的内存资源,切换开销远小于进程。
Java的 java.lang.Thread 类是线程操作的核心,它封装了线程的状态、优先级和执行逻辑。
二、创建与启动线程的四种方式
在实际开发中,我们很少直接使用 Thread 类,而是通过以下几种更优雅的方式实现多线程:
1. 继承Thread类(最基础)
java
class CustomThread extends Thread {
@Override
public void run() {
System.out.println("线程执行中: " + Thread.currentThread().getName());
}
}
// 启动
new CustomThread().start();
注意:必须调用 start() 方法才能启动新线程,直接调用 run() 只是普通方法调用。
2. 实现Runnable接口(推荐,解耦任务与线程)
java
Runnable task = () -> System.out.println("任务执行中");
new Thread(task).start();
3. 实现Callable接口(支持返回值和异常处理)
java
Callable
// 耗时计算
return 42;
};
FutureTask
new Thread(futureTask).start();
// 获取结果
Integer result = futureTask.get();
4. 使用ExecutorService线程池(生产环境首选)
直接创建线程会造成资源浪费,线程池是管理线程生命周期的最佳实践。
java
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> System.out.println("线程池任务执行"));
// 关闭线程池
executor.shutdown();
三、线程安全与同步机制
多线程并发访问共享资源时,极易引发竞态条件 (Race Condition),导致数据不一致。解决此问题的核心是原子性、可见性和有序性。
1. synchronized关键字
修饰方法或代码块,保证同一时刻只有一个线程进入临界区。
java
private int count = 0;
public synchronized void increment() {
count++;
}
2. ReentrantLock显式锁
功能更强大的锁机制,支持尝试锁、可中断锁、公平锁等高级特性。
java
private final Lock lock = new ReentrantLock();
public void safeIncrement() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}

浙公网安备 33010602011771号