java 如何理解线程
线程的基本概念
线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,所有线程共享进程的资源(如内存、文件句柄等),但每个线程拥有独立的程序计数器、栈和局部变量。线程的存在使得程序能够同时执行多个任务,提高效率。
线程与进程的区别
进程是资源分配的基本单位,线程是CPU调度的基本单位。
每个进程拥有独立的内存空间,线程共享同一进程的内存空间。
进程间通信需要借助IPC机制(如管道、消息队列等),线程间通信可以直接读写共享变量。
进程切换开销较大,线程切换开销较小。
Java中的线程实现方式
继承Thread类
创建一个类继承Thread并重写run()方法,通过调用start()启动线程。
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread running");
}
}
MyThread thread = new MyThread();
thread.start();
实现Runnable接口
实现Runnable接口的run()方法,将实例作为参数传递给Thread构造函数。
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable running");
}
}
Thread thread = new Thread(new MyRunnable());
thread.start();
实现Callable接口(带返回值)
通过Callable和FutureTask实现有返回值的线程任务。
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "Callable result";
}
}
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
System.out.println(futureTask.get()); // 获取返回值
线程的生命周期
线程的生命周期包括以下状态:
- NEW:线程被创建但未启动。
- RUNNABLE:线程正在执行或等待CPU资源。
- BLOCKED:线程被阻塞(如等待锁)。
- WAITING:线程无限期等待(如调用
Object.wait())。 - TIMED_WAITING:线程有限期等待(如调用
Thread.sleep())。 - TERMINATED:线程执行完毕或异常终止。
线程同步与锁机制
synchronized关键字
通过synchronized修饰方法或代码块,确保同一时间只有一个线程访问共享资源。
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
ReentrantLockReentrantLock提供更灵活的锁控制,支持公平锁和非公平锁。
class Counter {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
线程池的使用
通过ExecutorService管理线程池,避免频繁创建和销毁线程的开销。
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.submit(() -> System.out.println("Task executed"));
executor.shutdown();
线程间通信
通过wait()、notify()和notifyAll()实现线程间协作。

class SharedResource {
private boolean flag = false;
public synchronized void waitForFlag() throws InterruptedException {
while (!flag) {
wait();
}
}
public synchronized void setFlag() {
flag = true;
notifyAll();
}
}
线程的注意事项
- 避免死锁:确保锁的获取和释放顺序一致。
- 减少锁粒度:尽量缩小同步代码块的范围。
- 使用线程安全的集合类(如
ConcurrentHashMap)。 - 避免长时间占用锁,防止线程饥饿。






