多线程(十二)线程是如何通信的?

本文深入探讨了多线程环境中线程间通信的重要性,通过一个具体的读写线程实例,详细解析了如何利用wait和notify机制确保线程安全地共享资源。文章提供了完整的Java源码示例,展示了如何在多线程环境下实现数据的正确读取和写入。

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

什么是线程之前的通信?

多线程之前的通信,其实就是多个线程在操作同一个资源,但是操作动作不同
如图所示
在这里插入图片描述

多线程之间通讯需求

需求如下:第一个线程写入(input)用户,另一个线程读取(out)用户,实现读一个,写一个操作。
源码如下:源码中包含着线程安全的解决方法 wait和notify的用法

package com.zuojie;
/**
 * 共享资源
 * @author zuojie
 *
 */
public class Common {
	public String name;
	
	public String sex;
	//flag为true表示common已经读取值,flag为false out线程未读取值
	public boolean flag=false;

}

package com.zuojie;
/**
 * 
 * 写入线程
 * @author zuojie
 *
 */
public class InputThread extends Thread{
	public Common common;
	public InputThread(Common common) {
		this.common=common;
	}
	@Override
	public void run() {
		int count=0;
		while(true) {
			synchronized (common) {
				if(common.flag) {
					//当前线程等待 wait();类似于sleep可以让当前线程,从运行状态变为休眠状态
					//wait使用在多线程之间的同步 和synchronied一起使用
					try {
						common.wait();
					}catch(Exception e) {
						
					}
				}
				if(count==0) {
					common.name="zuojie";
					common.sex="男";
				}else {
					common.name="小二";
					common.sex="女";
				}
				//实现基数和偶数
				count=(count+1)%2;
				common.flag=true;
				common.notify();
			}
			
		}
	}

}

package com.zuojie;
/**
 * 读取线程
 * @author zuojie
 *
 */
public class OutputThread extends Thread{
	public Common common;
	public OutputThread(Common common) {
		this.common=common;
	}
	@Override
	public void run() {
		while(true) {
			synchronized (common) {
				if(!common.flag) {
					try {
						common.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println(common.name + "------" + common.sex);
				common.flag=false;
				common.notify();
			}
		}
		
	}

}

package com.zuojie;

public class ThreadDemo01 {
	public static void main(String[] args) {
		Common commo=new Common();
		InputThread input= new InputThread(commo);
		OutputThread output = new OutputThread(commo);
		input.start();
		output.start(); 
		
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值