什么是线程通信、如何实现?
所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。
线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。
线程通信常见模型
生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。
要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
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(); } } } |
以上就是Java实现线程通信的案例讲解的详细内容,更多关于Java线程通信的资料请关注其它相关文章!
原文链接:https://blog.csdn.net/qq_62731133/article/details/124436328