当前位置:首页 > 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是一个线程安全的队列,支持生产者-消费者模式。当队列为空时,消费者线程会被阻塞;当队列满时,生产者线程会被阻塞。

java 如何实现线程间的通讯

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让一组线程互相等待,到达屏障点后继续执行。可以重复使用,适合分阶段任务。

java 如何实现线程间的通讯

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
  • 线程等待:CountDownLatchCyclicBarrier
  • 数据交换:Exchanger
  • 资源控制:Semaphore
  • 状态标志:volatile

分享给朋友:

相关文章

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复…

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scale…

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue如何实现登录

vue如何实现登录

Vue 实现登录功能的方法 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,通常命名为 Login.vue。表单包含用户名和密码输入框,以及提交按钮。 <template>…

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <…

vue如何实现id

vue如何实现id

Vue 中实现 ID 的方法 在 Vue 中,可以通过多种方式为元素或组件分配唯一的 ID。以下是几种常见的方法: 使用 v-bind 绑定 ID 通过 v-bind 动态绑定 ID,可以在模板中直…