Java实现线程通信的案例讲解(java线程间通信)

网友投稿 298 2022-07-28


什么是线程通信、如何实现?

所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。

线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。

线程通信常见模型

生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。

要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己

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(accounthttp://3 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.currenthttp://Thread().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();

}

}

publSBJnAdpvgwic 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();

//锁对象,让当前线程进入等待http://

this.wait();

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

以上就是java实现线程通信的案例讲解的详细内容,更多关于Java线程通信的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java代码实现双向链表(java中双向链表的实现类)
下一篇:java模拟实现双向链表(双向链表 java)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~