Java线程如何通讯
Java线程通讯方法
Java线程通讯主要通过共享内存和消息传递实现,以下是几种常见方式:
共享变量
使用synchronized关键字保护共享变量,结合wait()和notify()机制:
class SharedObject {
private boolean flag = false;
public synchronized void waitForFlag() throws InterruptedException {
while(!flag) {
wait();
}
}
public synchronized void setFlag() {
flag = true;
notifyAll();
}
}
BlockingQueue
利用线程安全的阻塞队列实现生产者-消费者模式:
BlockingQueue<String> queue = new LinkedBlockingQueue<>();
// 生产者线程
queue.put("message");
// 消费者线程
String message = queue.take();
CountDownLatch
适用于一次性线程同步场景:
CountDownLatch latch = new CountDownLatch(3);
// 工作线程
latch.countDown();
// 主线程
latch.await();
CyclicBarrier
可重复使用的线程屏障:
CyclicBarrier barrier = new CyclicBarrier(3, () ->
System.out.println("All threads reached barrier"));
// 工作线程
barrier.await();
Exchanger
两个线程间交换数据:
Exchanger<String> exchanger = new Exchanger<>();
// 线程A
String dataA = exchanger.exchange("Data from A");
// 线程B
String dataB = exchanger.exchange("Data from B");
Semaphore
控制资源访问的并发数:
Semaphore semaphore = new Semaphore(5);
// 线程获取许可
semaphore.acquire();
try {
// 访问共享资源
} finally {
semaphore.release();
}
Future和Callable
获取线程执行结果:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(() -> "Result");
String result = future.get();
PipedStream
线程间通过管道传输数据:
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
// 写线程
out.write("data".getBytes());
// 读线程
int data = in.read();
选择通讯方式时应考虑具体场景,对于简单同步需求可使用synchronized,复杂场景建议使用java.util.concurrent包中的高级工具类。







