第八天

一、核心概念:线程与进程的本质区别

在开始编码前,我们需厘清两个基础概念:

  • 进程 (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 callable = () -> {
// 耗时计算
return 42;
};
FutureTask futureTask = new FutureTask<>(callable);
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();
}
}

posted @ 2026-03-18 21:35  yang…  阅读(4)  评论(0)    收藏  举报