在 Java 中,多线程通信通常指多个线程之间协调工作、交换数据或控制执行顺序。常见方式如下(从常用到高级):
适用于状态标志通知
class Task {
private volatile boolean running = true;
public void stop() {
running = false;
}
public void run() {
while (running) {
// 执行业务
}
}
}
✅ 轻量
❌ 不适合复杂协调
基于 synchronized
class Demo {
private final Object lock = new Object();
private boolean ready = false;
public void producer() throws InterruptedException {
synchronized (lock) {
ready = true;
lock.notify();
}
}
public void consumer() throws InterruptedException {
synchronized (lock) {
while (!ready) {
lock.wait();
}
System.out.println("消费");
}
}
}
⚠ 注意:
synchronized 内调用while 防止虚假唤醒java.util.concurrent.locks
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 等待
lock.lock();
try {
condition.await();
} finally {
lock.unlock();
}
// 唤醒
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
✅ 可多条件
✅ 更可控
java.util.concurrent
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
// 生产者
queue.put(1);
// 消费者
Integer val = queue.take();
✅ 线程安全
✅ 天然阻塞
✅ 不需要手动加锁
CountDownLatch latch = new CountDownLatch(3);
// 子线程
latch.countDown();
// 主线程
latch.await();
CyclicBarrier barrier = new CyclicBarrier(3);
barrier.await();
Exchanger<String> exchanger = new Exchanger<>();
String data = exchanger.exchange("A");
Future<Integer> f = executor.submit(() -> 1 + 1);
Integer r = f.get();
CompletableFuture.supplyAsync(() -> 1)
.thenAccept(System.out::println);
ConcurrentHashMapCopyOnWriteArrayListConcurrentLinkedQueue| 场景 | 推荐方式 |
|---|---|
| 简单状态通知 | volatile |
| 生产者消费者 | BlockingQueue |
| 精确唤醒 | Lock + Condition |
| 等待完成 | CountDownLatch |
| 结果返回 | Future |
| 高并发共享 | 并发集合 |
如果你有具体业务场景(如:生产者消费者、任务协调、结果汇总),我可以给你完整示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。