Java 线程间的通信机制详解

本文深入探讨Java中线程间的通信机制,包括volatile关键字的可见性和有序性、等待唤醒机制(wait()和notify()、park()和unpark())、join()方法的线程排队作用、管道输入输出流在线程间的数据传输以及ThreadLocal和InheritableThreadLocal类的使用,旨在帮助读者理解和掌握线程通信的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、volatile 关键字

2、等待唤醒(等待通知)机制

(1)wait() 和 notify() 等待唤醒

(2)park() 和 unpark() 等待唤醒

3、join() 方法——线程排队

4、管道输入输出流

5、ThreadLocal类和InheritableThreadLocal类


线程间通信使线程成为一个整体,提高系统之间的交互性,在提高CPU利用率的同时可以对线程任务进行有效的把控与监督。

1、volatile 关键字

volatile有两大特性,一是可见性,二是有序性,禁止指令重排序。其中可见性就是可以让线程之间进行通信。

以下两个线程会轮流执行

public class VolatileTest {
    // 保证可见性和有序性
    private static volatile boolean flag = true;

    public static void main(String[] args) {
        new Thread(new Runnable() { // 线程一
            @Override
            public void run() {
                while (true) {
                    if (flag) {
                        System.out.println(Thread.currentThread().getName()+": turn on");
                        flag = false;
                    }
                }
            }
        }, "thread-1").start();
        new Thread(new Runnable() { // 线程二
            @Override
            public void run() {
                while (true) {
                    if (!flag) {
                        System.out.println(Thread.currentThread().getName()+": turn off");
                        flag = true;
                    }
                }
            }
        }, "thread-2").start();
    }
}

2、等待唤醒(等待通知)机制

(1)wait() 和 notify() 等待唤醒

等待唤醒机制可以基于 wait()notify() 方法来实现,在一个线程内调用该线程锁对象的 wait() 方法, 线程将进入等待队列等待直到被唤醒。

wait()/notify() 方法只能在同步方法或同部块中调用

调用 wait() 方法,线程需要获取该对象的对象级别锁,如果没有持锁,将会抛出IllegalMonitorStateException,执行 wait() 方法后,当前线程立即释放锁

执行 notify() 方法后,当前线程不会立即释放锁,需要等到执行 notify() 方法的线程将程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,此时 wait() 状态所在的线程才可以获取该对象的锁。

public class ThreadTest {
    // 对象锁
    private static final Object lock = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() { // 线程一
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + ":获取锁");
                    try {
                        lock.wait(); // 线程进入等待
                        System.out.println(Thread.currentThread().getName() + ":执行wait()方法结束");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":执行结束");
                }
            }
        }, "thread-1").start();
        new Thread(new Runnable() { // 线程二
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println(Thread.currentThread().getName() + "获取锁");
                    lock.notify(); // 唤醒一个线程
                    System.out.println(Thread.currentThread().getName() + ":执行notify()方法结束");
                    try {
                        Thread.sleep(1000); 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

swadian2008

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

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

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

打赏作者

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

抵扣说明:

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

余额充值