java基础-线程间通信方式


在 Java 中,线程间的通信是非常重要的,尤其是在多线程编程中,它有助于协调线程的行为,确保资源的正确访问和更新。Java 提供了多种方式来实现线程间的通信,主要包括以下几种方法:

1. wait() 和 notify()

这是最基础的线程间通信方式之一,基于 Object 类中的 wait()notify() 方法。它们通常用于实现生产者-消费者模式。

实现示例:

public class WaitNotifyExample {
    private final Object lock = new Object();
    private boolean flag = false;

    public void producer() {
        synchronized(lock) {
            if (flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 生产一些数据...
            flag = true;
            lock.notify(); // 通知消费者
        }
    }

    public void consumer() {
        synchronized(lock) {
            if (!flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 消费数据...
            flag = false;
            lock.notify(); // 通知生产者
        }
    }
}

2. volatile 关键字

volatile 关键字可以确保变量的可见性,即一个线程修改了一个共享变量的值,另一个线程能立即看到这个变化。

实现示例:

public class VolatileExample {
    private volatile boolean running = true;

    public void startThread() {
        Thread thread = new Thread(() -> {
            while (running) {
                // 执行一些任务
            }
            System.out.println("线程停止");
        });
        thread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        running = false; // 通知线程停止
    }
}

3. Java.util.concurrent 包提供的工具类

Java 提供了 java.util.concurrent 包来简化线程间的通信,其中包括 CountDownLatch, CyclicBarrier, Semaphore, Exchanger, FutureBlockingQueue 等。

实现示例:

Semaphore(信号量)

信号量用于控制同时访问特定资源的线程数量。

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    private final Semaphore semaphore = new Semaphore(1);

    public void acquireAccess() throws InterruptedException {
        semaphore.acquire(); // 获取许可
        try {
            // 访问资源
        } finally {
            semaphore.release(); // 释放许可
        }
    }
}
BlockingQueue(阻塞队列)

阻塞队列是用于存放消息的容器,它支持生产者-消费者模式。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueExample {
    private final BlockingQueue<String> queue = new LinkedBlockingQueue<>(100);

    public void produce(String item) {
        try {
            queue.put(item); // 生产者放入消息
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public String consume() throws InterruptedException {
        return queue.take(); // 消费者取出消息
    }
}

4. Atomic 类

Java 提供了 java.util.concurrent.atomic 包来处理原子操作,可以用来实现线程安全的计数器或其他共享变量。

实现示例:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    private AtomicInteger count = new AtomicInteger(0);

    public int incrementAndGet() {
        return count.incrementAndGet();
    }
}

这些方法都可以帮助你在 Java 中实现线程间的通信。选择哪种方法取决于你的具体需求和上下文环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值