当前位置:首页 > 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中实现“记住我”功能通常涉及前端保存用户登录状态(如token)到本地存储,并在下次访问时自动恢复登录状态。以下是具体实现方法: 使用localStorage或co…

权限管理vue如何实现

权限管理vue如何实现

基于路由的权限控制 在Vue中可以通过路由守卫实现页面级权限控制。定义路由时添加meta字段标记权限角色: const routes = [ { path: '/admin',…

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty(…

vue router如何实现

vue router如何实现

Vue Router 的实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue Router 的具体方法: 安装 Vue Router…

vue如何实现删除

vue如何实现删除

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个关键步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,为每个项目添加删除按钮。确保数据存储在 Vue 的 data…

如何实现分页vue

如何实现分页vue

使用 v-pagination 组件(Vuetify) 如果项目使用 Vuetify,可以直接使用内置的 v-pagination 组件。该组件提供了分页功能,支持自定义样式和事件。 <tem…