java 如何实现线程间的通讯
线程间通信的实现方式
在Java中,线程间通信可以通过共享内存或消息传递机制实现。以下是几种常见的实现方式:
使用wait()、notify()和notifyAll()
这三个方法是Object类的成员,必须在同步块或同步方法中使用。wait()使当前线程释放锁并进入等待状态,直到其他线程调用notify()或notifyAll()唤醒它。
synchronized (lockObject) {
while (conditionNotMet) {
lockObject.wait();
}
// 执行任务
}
synchronized (lockObject) {
// 改变条件
lockObject.notifyAll();
}
使用BlockingQueue
BlockingQueue是一个线程安全的队列,支持生产者-消费者模式。当队列为空时,消费者线程会被阻塞;当队列满时,生产者线程会被阻塞。

BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
// 生产者线程
queue.put(1);
// 消费者线程
int value = queue.take();
使用CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。初始化时指定计数,调用countDown()减少计数,await()阻塞直到计数为零。
CountDownLatch latch = new CountDownLatch(2);
// 工作线程
latch.countDown();
// 主线程
latch.await();
使用CyclicBarrier
CyclicBarrier让一组线程互相等待,到达屏障点后继续执行。可以重复使用,适合分阶段任务。

CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads reached barrier"));
// 线程任务
barrier.await();
使用Exchanger
Exchanger用于两个线程间交换数据,当一个线程调用exchange()时会阻塞,直到另一个线程也调用exchange()。
Exchanger<String> exchanger = new Exchanger<>();
// 线程A
String dataFromB = exchanger.exchange("Data A");
// 线程B
String dataFromA = exchanger.exchange("Data B");
使用Semaphore
Semaphore控制对资源的访问权限,通过acquire()获取许可,release()释放许可。
Semaphore semaphore = new Semaphore(3);
// 线程获取许可
semaphore.acquire();
try {
// 访问资源
} finally {
semaphore.release();
}
使用volatile变量
volatile保证变量的可见性,但不保证原子性。适合作为状态标志。
private volatile boolean flag = false;
// 线程A
flag = true;
// 线程B
while (!flag) {
// 等待
}
选择通信方式的依据
- 简单同步:
wait()/notify() - 生产者-消费者:
BlockingQueue - 线程等待:
CountDownLatch或CyclicBarrier - 数据交换:
Exchanger - 资源控制:
Semaphore - 状态标志:
volatile






