线程是程序执行的最小单元,一个进程可包含多个线程,线程共享进程的内存,但各自独立调度。多线程提升并发与响应性。
方式一:继承 Thread 类
class MyThread extends Thread {
public void run() { System.out.println("线程运行"); }
}
new MyThread().start(); // start 启动新线程,调用 run 只是普通方法
方式二:实现 Runnable 接口(推荐)
class Task implements Runnable {
public void run() { System.out.println("任务运行"); }
}
new Thread(new Task()).start();
start() 才真正创建线程;直接调 run() 是普通调用,不并发。setDaemon(true),主线程结束即退出。新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked/Waiting/Timed Waiting)→ 终止(Terminated)。start 进入就绪,抢到 CPU 才运行;sleep/join/wait 进入等待,synchronized 竞争失败进入阻塞。
setPriority(1~10),仅作为调度参考,不保证顺序。Thread.sleep(ms) 让出 CPU。Thread.yield() 建议让出,不保证。join() 等待目标线程结束后再继续。多个线程共享数据时会出现线程安全问题(竞态),需同步保证原子性。
class Counter {
private int count = 0;
public synchronized void increment() { count++; } // 同步方法
public synchronized int get() { return count; }
}
synchronized(obj) { ... } 锁定对象,保证互斥。this;静态同步方法锁的是类对象(Class)。本质:
synchronized基于 JVM 的监视器(monitor)锁,进入/退出自动加解锁;底层对应 C 的 pthread mutex 概念,但 Java 内置、无需手动 init/destroy。
用 wait()/notify()/notifyAll()(在 synchronized 内使用)实现线程协作——生产者/消费者模型:
synchronized (lock) {
while (queue.isEmpty()) lock.wait(); // 等待
// 消费...
lock.notifyAll(); // 唤醒等待线程
}
| 维度 | Java | C | C++ | Python |
|---|---|---|---|---|
| 线程 | 内置 Thread/Runnable | pthread 库 | std::thread | threading |
| 同步 | synchronized | mutex/cond | mutex/lock_guard | Lock |
| 内存模型 | JMM 规范 | 无统一 | C++11 起有 | 有 |
| 局限 | — | 繁琐 | — | GIL |
关键差异:C 需手动管理 pthread 的创建、锁、销毁;C++ 用 RAII 包装锁;Python 有全局解释器锁(GIL),多线程无法真正并行 CPU 密集任务;Java 线程与同步内置于语言和 JVM,抽象层次最高、最易用。