java并发-线程通信(9)

本文详细介绍了线程间通信的方式及注意事项,包括通过共享变量进行间接通信的方法,以及使用wait、notify和notifyAll实现线程同步的具体操作。通过实例代码展示了不同通知机制的工作原理。

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

需要通信的多种方式以及注意事项请移步:http://ifeve.com/thread-signaling/

线程通信方式:

1:多个线程之间通过共享变量通信。也就是A线程修改了变量x=11,B线程拿到x的值就是A修改之后的值11。这也是线程之间的间接通信。

2.通过方法wait,notiy,notifiAll.

wait:A线程调用了该方法,那么A线程将沉睡,也就是没有了CPU执行权,需要其他线程调用notify或者notifyAll唤醒,才会有CPU执行权,但是有了CPU执行权不代表A线程可以继续执行代码,因为还需要获取锁。所以调用wait代表改线程失去了CPU执行权和锁。

notify:随机唤醒一个需要同一把锁的线程。被唤醒的线程拥有了CPU执行权。锁的释放不是由该方法管理。

notifyAll:唤醒所有需要同一把锁的线程,所有的唤醒线程拥有了CPU执行权,然后所有线程共同竞争锁。和notify的区别就是notifyAll是唤醒所有线程,其余特性一致。

package com.concurenny.chapter.eight;

/**
 * 创建者:Mr lebron 创建时间:2017年11月17日 下午4:03:01
 */
public class NotifyDemo {
	public static void main(String[] args) {
		new Thread(() -> {
			wait2();
		}).start();
		new Thread(() -> {
			wait2();
		}).start();
		new Thread(() -> {
			notify2();
		}).start();
	}

	public static synchronized void wait2() {
		while (true) {
			System.out.println("wait 前:");
			try {
				NotifyDemo.class.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("wait 后:");
		}
	}

	public static synchronized void notify2() {
		System.out.println("notify 前:");
		NotifyDemo.class.notify();
		System.out.println("notify 后:");
	}
}
package com.concurenny.chapter.eight;

/**
 * 创建者:Mr lebron 创建时间:2017年11月17日 下午4:03:01
 */
public class NotifyAllDemo {
	public static void main(String[] args) {
		new Thread(() -> {
			wait2();
		}).start();
		new Thread(() -> {
			wait2();
		}).start();
		new Thread(() -> {
			notifyAll2();
		}).start();
	}

	public static synchronized void wait2() {
		while (true) {
			System.out.println("wait 前:");
			try {
				NotifyAllDemo.class.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("wait 后:");
		}
	}

	public static synchronized void notifyAll2() {
		System.out.println("notify 前:");
		NotifyAllDemo.class.notifyAll();
		System.out.println("notify 后:");
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值