分享

Java学习——114.交互线程

 pythonjava学习 2021-04-06

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

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

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

如以下例题:

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

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,但这个结果是错误的。

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

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多