龙空技术网

Java学习——.交互线程

多肉与月季 81

前言:

目前朋友们对“多线程模拟银行取款”可能比较重视,朋友们都需要知道一些“多线程模拟银行取款”的相关内容。那么小编同时在网络上网罗了一些关于“多线程模拟银行取款””的相关内容,希望你们能喜欢,看官们一起来了解一下吧!

线程在执行的过程中,有可能会需要共享资源或者交换数据,则称这一组线程为交互线程。

线程间的交互存在两种关系:竞争和协作。

竞争关系是指,两个线程同时使用同一个资源时,会产生竞争。此时,由于线程的并发执行,可能会产生与时间有关的错误。

如以下例题:

本例题是模拟银行的账户,存款和取款均为线程,对不同账户的操作不会产生问题,但如果是对同一个账户同时存款和取款时,可能会发生错误,其代码如下:

public class Account {//账户类

String name;

double money;

public Account() {

name=null;

money=0;

}

public Account(String name,double money) {

this.set(name,money);

}

public void set(String name,double money) {

this.name=name;

this.money=money;

}

public String get_name() {

return name;

}

public double get_money() {

return money;

}

public void quqian(double money) {//取钱

if(money<0)

;

if(this.money>money)

this.money=this.money-money;

else

System.out.println("您的账户余额不足");

}

public void cunqian(double money) {//存钱

if(money>0)

this.money+=money;

}

public String toString() {

return"账户名:"+this.name+",账户中有:"+this.money;

}

}

class exa{

public static void main(String args[]) {

Account count=new Account("张三",300);

System.out.println(count);

SaveMoney save=new SaveMoney(count,100);

SaveMoney save1=new SaveMoney(count,100);

save.start();

save1.start();

getMoney get=new getMoney(count,100);

get.start();

}

}

public class SaveMoney extends Thread{//存钱类,继承自线程类

private Account account;

private doublevalue;

public SaveMoney(Account a,double v) {

this.account=a;

this.value=v;

}

public void run() {

this.account.cunqian(value);

System.out.println("存入"+value+"后,您的账户余额为:"+this.account.money);

}

}

public class getMoney extends Thread{//取钱类,继承自线程类

private Account account;

private doublevalue;

public getMoney(Account a,double v) {

this.account=a;

this.value=v;

}

public void run() {

this.account.quqian(value);

System.out.println("取出"+value+"后,您的账户余额为:"+this.account.money);

}

}

其运行结果如下:

从这个结果会发现,“张三”这个账户中原有300元,在存入100元之后却变成了500元,这个结果明显不是我们想要的结果,产生这个错误的原因就在于,存钱线程有两个,取钱线程有一个,都是对账户“张三”在进行操作,由于线程的并发执行,在两个存钱线程有可能是同时执行的,所以它的结果会变为500,但这个结果是错误的。

要解决这个错误,需要互斥。

下一篇会介绍线程的互斥。

我自己是一名从事了多年开发的JAVA老程序员,辞职目前在做自己的java私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:java,即可免费获取。

——————————————————————

作者: java学习 从零开始

来源:微信公众号

标签: #多线程模拟银行取款