当前位置:首页 > Java

java 如何实现线程间的通讯

2026-03-03 21:42:18Java

线程间通信的实现方式

在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保证变量的可见性,但不保证原子性。适合作为状态标志。

java 如何实现线程间的通讯

private volatile boolean flag = false;

// 线程A
flag = true;

// 线程B
while (!flag) {
    // 等待
}

选择通信方式的依据

  • 简单同步:wait()/notify()
  • 生产者-消费者:BlockingQueue
  • 线程等待:CountDownLatchCyclicBarrier
  • 数据交换:Exchanger
  • 资源控制:Semaphore
  • 状态标志:volatile

分享给朋友:

相关文章

vue如何实现到期提醒

vue如何实现到期提醒

实现思路 在Vue中实现到期提醒功能,可以通过计算日期差、定时检查和通知用户三个核心步骤完成。需要结合Vue的响应式特性和JavaScript的日期处理能力。 计算日期差 使用JavaScr…

react如何实现keepalive

react如何实现keepalive

React 实现 KeepAlive 的方法 React 本身没有内置的 KeepAlive 组件,但可以通过以下方式模拟类似功能,实现组件状态保持或避免重复渲染。 使用 CSS 隐藏组件 通过 C…

java如何实现分布式

java如何实现分布式

分布式系统实现方式 Java实现分布式系统通常涉及多种技术和框架,以下是几种核心方法: 基于RPC框架 使用Dubbo、gRPC等RPC框架实现服务间的远程调用。Dubbo提供高性能的RPC通信,支…

vue 如何实现返回

vue 如何实现返回

Vue 实现返回功能的方法 使用 router.go(-1) 在 Vue 中可以通过 Vue Router 的 go 方法实现返回上一页的功能。在需要触发返回的按钮或方法中调用 this.$route…

vue 如何实现vmodel

vue 如何实现vmodel

Vue 中实现 v-model 的方法 v-model 是 Vue 中用于实现双向数据绑定的指令,通常用于表单元素。以下是实现 v-model 的几种方式: 在表单元素上使用 v-model 对于原…

vue如何实现trigger

vue如何实现trigger

Vue 中实现 trigger 的方法 在 Vue 中,可以通过多种方式实现类似 trigger 的功能,即触发事件或方法。以下是几种常见的方法: 使用 $emit 触发自定义事件 Vue 组件可以…