当前位置:首页 > Java

如何实现java线程间的通信

2026-03-17 20:05:23Java

使用共享变量

通过共享的变量或对象实现线程间通信,需使用 volatile 关键字或同步机制(如 synchronized)保证可见性。例如:

class SharedObject {
    volatile boolean flag = false;
}

线程通过修改和读取 flag 实现简单通信。

使用 wait/notify 机制

通过 Object 类的 wait()notify()notifyAll() 方法实现线程协作。需在同步块中调用:

synchronized (lock) {
    while (!condition) {
        lock.wait(); // 释放锁并等待
    }
    // 条件满足后执行任务
    lock.notifyAll(); // 唤醒其他线程
}

使用 BlockingQueue

利用 BlockingQueue(如 ArrayBlockingQueue)实现生产者-消费者模型:

BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生产者线程
queue.put("data"); // 阻塞直到队列有空位
// 消费者线程
String data = queue.take(); // 阻塞直到队列有数据

使用 CountDownLatch

通过 CountDownLatch 实现线程等待其他线程完成:

CountDownLatch latch = new CountDownLatch(3);
// 工作线程
latch.countDown(); // 计数减1
// 主线程
latch.await(); // 阻塞直到计数归零

使用 CyclicBarrier

CyclicBarrier 让多个线程在屏障点同步:

CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads reached"));
// 线程内调用
barrier.await(); // 阻塞直到所有线程到达

使用 Exchanger

Exchanger 实现两个线程间交换数据:

Exchanger<String> exchanger = new Exchanger<>();
// 线程A
String dataA = exchanger.exchange("Data from A");
// 线程B
String dataB = exchanger.exchange("Data from B");

使用 PipedStream

通过 PipedInputStreamPipedOutputStream 实现线程间字节流通信:

PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);
// 线程A写入
pos.write("data".getBytes());
// 线程B读取
int data = pis.read();

使用回调机制

通过接口回调实现线程间通知:

interface Callback {
    void onComplete(String result);
}
// 工作线程
callback.onComplete("Done");

使用 CompletableFuture

CompletableFuture 提供异步任务链式调用和结果传递:

如何实现java线程间的通信

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApplyAsync(s -> s + " World")
    .thenAccept(System.out::println);

分享给朋友:

相关文章

uniapp 线程

uniapp 线程

uniapp 线程的概念 在 uniapp 中,线程的概念与原生应用开发有所不同。由于 uniapp 是基于 JavaScript 的运行环境,它并不直接支持多线程操作。JavaScript 本身是单…

vue如何实现select

vue如何实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过原生 HTML <select> 元素或使用第三方 UI 库(如 Element UI、Ant Des…

vue如何实现加减

vue如何实现加减

在 Vue 中实现加减功能 使用数据绑定和事件处理 通过 Vue 的数据绑定和事件处理机制可以轻松实现加减功能。定义一个数据变量存储数值,通过方法增减该变量。 <template>…

vue如何实现录音

vue如何实现录音

使用Web Audio API实现录音 在Vue中实现录音功能可以通过Web Audio API结合MediaRecorder API来完成。以下是一个基础实现方案: 安装必要的依赖: npm i…

vue如何实现轮播

vue如何实现轮播

使用 Vue 实现轮播 使用第三方库(推荐) Vue 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper。以下是使用 vue-awesome-swiper 的示…

如何在java中实现线程

如何在java中实现线程

实现线程的两种主要方法 在Java中实现线程有两种主要方法:继承Thread类和实现Runnable接口。两种方法各有优缺点,适用于不同场景。 继承Thread类 通过继承Thread类并重写run…