Java学习——114.交互线程
线程在执行的过程中,有可能会需要共享资源或者交换数据,则称这一组线程为交互线程。
线程间的交互存在两种关系:竞争和协作。
竞争关系是指,两个线程同时使用同一个资源时,会产生竞争。此时,由于线程的并发执行,可能会产生与时间有关的错误。
如以下例题:
本例题是模拟银行的账户,存款和取款均为线程,对不同账户的操作不会产生问题,但如果是对同一个账户同时存款和取款时,可能会发生错误,其代码如下:
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,但这个结果是错误的。
要解决这个错误,需要互斥。
下一篇会介绍线程的互斥。