Java如何实现线程通信
作者:FreshDream
时间:2023-04-30
来源:互联网
浏览:0
什么是线程通信、如何实现?所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。线程通信常见模型生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己publicclass多线程_5线程通信extendsThread{publicstaticvoidmain(String[]args){//定义线程类,
什么是线程通信、如何实现?
所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。
线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。
线程通信常见模型
生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。
要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己
public class 多线程_5线程通信 extends Thread{
public static void main(String[] args) {
//定义线程类,创建一个共享的账户对象
account3 a=new account3("abc",0);
//创建两个取钱的线程对象
new drawthread3(a,"小明").start();
new drawthread3(a,"小红").start();
//创建三个存钱的线程对象
new savethread(a,"存钱罐1号").start();
new savethread(a,"存钱罐2号").start();
new savethread(a,"存钱罐3号").start();
}
}
//存钱的线程类
class savethread extends Thread{
//接收处理的账户对象
private account3 acc;
public savethread(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//存钱
acc.savemoney(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//取钱的线程类
class drawthread3 extends Thread{
//接收处理的账户对象
private account3 acc;
public drawthread3(account3 acc,String name){
super(name);
this.acc=acc;
}
public void run(){
try {
while (true){
//取钱
acc.drawmoney3(100000);
//休眠2秒
Thread.sleep(2000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class account3{
private String cartId;
private double money;//账户余额
public account3() {
}
public account3(String cartId, double money) {
this.cartId = cartId;
this.money = money;
}
public String getCartId() {
return cartId;
}
public void setCartId(String cartId) {
this.cartId = cartId;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public synchronized void savemoney(double money) {
//先获取是谁来存钱,线程名即是人名
String name=Thread.currentThread().getName();
//判断账户是否有钱
try {
if(this.money==0){
//没钱,存钱
this.money+=money;
System.out.println(name+"来存钱,存了:"+money+"存钱后余额为:"+this.money);
//有钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else {
//有钱,不存钱
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void drawmoney3(double money) {
//先获取是谁来取钱,线程名即是人名
String name=Thread.currentThread().getName();
try {
//判断账户是否够钱
if(this.money>=money){
//有钱,取钱
this.money-=money;
System.out.println(name+"来取钱成功,取了:"+money+"余额是:"+this.money);
//没钱了
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}else{
//余额不足
//唤醒所有线程
this.notifyAll();
//锁对象,让当前线程进入等待
this.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
作者最新文章
vivo V80 曝光:10月发布,首推10倍人像变焦与蔡司夜景长焦
2026-09-08 17:00
PDF转Excel操作指南:极轻PDF在线工具使用步骤与结果核对
2026-09-02 19:02
Blender 3D动画制作入门:绑定、关键帧、灯光与渲染全流程
2026-09-02 11:10
PS教程:图层、选区、蒙版与调色核心操作
2026-09-02 10:12
iQOO Pro(12GB/128GB/5G全网通)忘了手机密码怎么办?
2026-08-25 15:47
上一篇:
MySQL下载安装及完美卸载的方法
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















