线程间通信(Inter-Thread Communication,ITC)指的是多个线程之间协调工作、交换数据或同步状态。实现方式取决于你使用的编程语言和运行环境。下面以通用原理 + Java 为主进行说明,并简要对比其他语言。
wait() / notify() / notifyAll()(最经典)前提:必须在 synchronized 代码块或方法中
class Shared {
private int data;
private boolean available = false;
public synchronized void produce(int value) throws InterruptedException {
while (available) {
wait(); // 等待消费者消费
}
data = value;
available = true;
notifyAll(); // 唤醒消费者
}
public synchronized int consume() throws InterruptedException {
while (!available) {
wait(); // 等待生产者生产
}
available = false;
notifyAll(); // 唤醒生产者
return data;
}
}
✅ 特点:
while + 条件判断)volatile + 自旋(简单状态通信)适合状态标志
class Task implements Runnable {
private volatile boolean running = true;
public void stop() {
running = false;
}
public void run() {
while (running) {
// do work
}
}
}
✅ 适合:
❌ 不适合:
Lock + Condition(比 wait/notify 更灵活)java.util.concurrent.locks
Lock lock = new ReentrantLock();
Condition notEmpty = lock.newCondition();
Condition notFull = lock.newCondition();
lock.lock();
try {
while (queue.isEmpty()) {
notEmpty.await();
}
// 消费
notFull.signal();
} finally {
lock.unlock();
}
✅ 优点:
BlockingQueue
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
// 生产者
queue.put(1);
// 消费者
int value = queue.take();
✅ 优点:
CountDownLatch(等待其他线程完成)CountDownLatch latch = new CountDownLatch(3);
// 子线程
latch.countDown();
// 主线程
latch.await();
✅ 用于:
CyclicBarrier(线程互相等待)CyclicBarrier barrier = new CyclicBarrier(3);
barrier.await();
✅ 用于:
Future / Callable(线程返回结果)ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(() -> 1 + 1);
Integer result = future.get();
✅ 用于:
| 语言 | 常见方式 |
|---|---|
| Java | wait/notify、Lock、BlockingQueue、Future |
| C++ | 条件变量 condition_variable、互斥量 |
| Python | queue.Queue、Event、Lock |
| Go | channel(最推荐) |
✅ 推荐优先级
BlockingQueue(生产者-消费者)Lock + ConditionCountDownLatch / CyclicBarrierwait/notify(了解原理即可)volatile(仅状态标志)线程间通信 = 共享变量 + 协调机制
实战中:能用高级并发工具,就别手写 wait/notify
如果你有具体场景(如:生产者消费者、线程池、异步结果返回),我可以给你针对性示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。