当前位置:首页 > Java

java如何实现线程间的通讯

2026-03-03 22:01:07Java

线程间通信的基本方法

Java中线程间通信主要通过共享内存和消息传递两种方式实现。共享内存涉及同步机制,消息传递则通过等待/通知机制或并发工具类完成。

使用wait()和notify()机制

通过Object类的wait()notify()notifyAll()方法实现经典的生产者-消费者模型。需在同步代码块或同步方法中调用这些方法。

class SharedResource {
    private boolean isReady = false;

    public synchronized void produce() {
        while (isReady) {
            wait(); // 等待消费
        }
        System.out.println("生产数据");
        isReady = true;
        notify(); // 通知消费者
    }

    public synchronized void consume() {
        while (!isReady) {
            wait(); // 等待生产
        }
        System.out.println("消费数据");
        isReady = false;
        notify(); // 通知生产者
    }
}

使用BlockingQueue实现

java.util.concurrent.BlockingQueue提供线程安全的队列操作,支持阻塞插入和移除。

BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);

// 生产者线程
new Thread(() -> {
    try {
        queue.put(1); // 阻塞插入
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

// 消费者线程
new Thread(() -> {
    try {
        Integer item = queue.take(); // 阻塞移除
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

使用CountDownLatch同步

CountDownLatch允许一个或多个线程等待其他线程完成操作。

java如何实现线程间的通讯

CountDownLatch latch = new CountDownLatch(3);

// 工作线程
for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        System.out.println("子线程执行");
        latch.countDown();
    }).start();
}

latch.await(); // 主线程等待
System.out.println("所有子线程完成");

使用CyclicBarrier协调

CyclicBarrier让一组线程相互等待,到达屏障点后继续执行。

CyclicBarrier barrier = new CyclicBarrier(3, () -> {
    System.out.println("所有线程到达屏障");
});

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        try {
            barrier.await();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();
}

使用Exchanger交换数据

Exchanger允许两个线程在同步点交换数据。

java如何实现线程间的通讯

Exchanger<String> exchanger = new Exchanger<>();

new Thread(() -> {
    try {
        String data = exchanger.exchange("Thread1数据");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

new Thread(() -> {
    try {
        String data = exchanger.exchange("Thread2数据");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

使用管道流通信

PipedInputStreamPipedOutputStream实现线程间字节流通信。

PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream(pis);

new Thread(() -> {
    try {
        pos.write("管道数据".getBytes());
        pos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

new Thread(() -> {
    try {
        int data;
        while ((data = pis.read()) != -1) {
            System.out.print((char) data);
        }
        pis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

使用volatile变量

volatile关键字确保变量的可见性,但不保证原子性。

class SharedFlag {
    volatile boolean flag = false;
}

SharedFlag shared = new SharedFlag();

new Thread(() -> {
    while (!shared.flag) {
        // 等待flag变化
    }
    System.out.println("检测到flag变化");
}).start();

new Thread(() -> {
    try {
        Thread.sleep(1000);
        shared.flag = true;
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    }
}).start();

使用Condition接口

Condition接口提供更灵活的线程等待/通知机制,需与Lock配合使用。

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

new Thread(() -> {
    lock.lock();
    try {
        condition.await(); // 等待
        System.out.println("被唤醒");
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        lock.unlock();
    }
}).start();

new Thread(() -> {
    lock.lock();
    try {
        condition.signal(); // 唤醒
    } finally {
        lock.unlock();
    }
}).start();

每种方法适用于不同场景:低级别控制可用wait()/notify(),生产者-消费者模型适合BlockingQueue,多阶段任务适合CyclicBarrier。选择时需考虑线程安全、性能需求和代码复杂度。

分享给朋友:

相关文章

vue如何实现滤镜

vue如何实现滤镜

Vue 实现滤镜的方法 在 Vue 中实现滤镜效果可以通过多种方式,以下是常见的几种方法: 使用 CSS filter 属性 通过 CSS 的 filter 属性可以直接为元素添加滤镜效果。在 V…

vue如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件:…

如何实现语音react

如何实现语音react

语音识别基础设置 在React中实现语音识别功能通常需要借助浏览器的Web Speech API或第三方库。Web Speech API提供了SpeechRecognition接口,允许应用程序直接访…

如何实现java序列化

如何实现java序列化

实现Java序列化的方法 1. 实现Serializable接口 要使一个类可序列化,需要让该类实现java.io.Serializable接口。这是一个标记接口,没有任何方法需要实现。 publi…

如何实现翻页式h5

如何实现翻页式h5

翻页式H5的实现方法 翻页式H5通常指通过滑动或点击切换页面的交互形式,常用于营销活动、产品展示等场景。以下是几种常见的实现方式: 使用HTML5和CSS3实现基础翻页 通过CSS3的transfo…

前段vue如何实现

前段vue如何实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的 Vue 实现方法: 组件化开发 Vue 的核心思想是组件化开发。每个组件可以独立封装逻辑、模板和样式,便于复…