如何实现java线程间的通信
使用共享变量
通过共享的变量或对象实现线程间通信,需使用 volatile 关键字或同步机制(如 synchronized)保证可见性。例如:
class SharedObject {
volatile boolean flag = false;
}
线程通过修改和读取 flag 实现简单通信。
使用 wait/notify 机制
通过 Object 类的 wait()、notify() 和 notifyAll() 方法实现线程协作。需在同步块中调用:
synchronized (lock) {
while (!condition) {
lock.wait(); // 释放锁并等待
}
// 条件满足后执行任务
lock.notifyAll(); // 唤醒其他线程
}
使用 BlockingQueue
利用 BlockingQueue(如 ArrayBlockingQueue)实现生产者-消费者模型:

BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生产者线程
queue.put("data"); // 阻塞直到队列有空位
// 消费者线程
String data = queue.take(); // 阻塞直到队列有数据
使用 CountDownLatch
通过 CountDownLatch 实现线程等待其他线程完成:
CountDownLatch latch = new CountDownLatch(3);
// 工作线程
latch.countDown(); // 计数减1
// 主线程
latch.await(); // 阻塞直到计数归零
使用 CyclicBarrier
CyclicBarrier 让多个线程在屏障点同步:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads reached"));
// 线程内调用
barrier.await(); // 阻塞直到所有线程到达
使用 Exchanger
Exchanger 实现两个线程间交换数据:

Exchanger<String> exchanger = new Exchanger<>();
// 线程A
String dataA = exchanger.exchange("Data from A");
// 线程B
String dataB = exchanger.exchange("Data from B");
使用 PipedStream
通过 PipedInputStream 和 PipedOutputStream 实现线程间字节流通信:
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
// 线程A写入
pos.write("data".getBytes());
// 线程B读取
int data = pis.read();
使用回调机制
通过接口回调实现线程间通知:
interface Callback {
void onComplete(String result);
}
// 工作线程
callback.onComplete("Done");
使用 CompletableFuture
CompletableFuture 提供异步任务链式调用和结果传递:
CompletableFuture.supplyAsync(() -> "Hello")
.thenApplyAsync(s -> s + " World")
.thenAccept(System.out::println);






