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

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

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

(0)

相关推荐

  • 如何在自动存取款机上,取钱和存钱,方便老年人一学就会!

    如何在自动存取款机上,取钱和存钱,方便老年人一学就会!

  • 教老年人,怎么在自助存取款机存钱、取钱?银行卡被吞怎么处理?

    教老年人,怎么在自助存取款机存钱、取钱?银行卡被吞怎么处理?

  • java学习——115.线程的互斥

    线程互斥是解决线程间竞争关系的手段. 在上一篇中,由于两个线程对同一个账户资源进行操作,两线程在同时对"张三"这个账户时进行操作时,存在着竞争关系,就造成了输出结果的不正确. 要解 ...

  • java学习——111.线程的状态

    线程是从创建到执行完毕,总共有6个状态, 1. New(新建态) 当用new操作符创建一个新线程时,如 new Thread(r), 该线程还没有开始运行.这意味着它的状态是new. 2. Runna ...

  • Java学习-注解和反射

    注解 java.Annotation Annotation的作用:可以呗其他程序读取 Annotation的格式 注解是:@注释名 在代码中存在,还可以添加一些参数 ​@SuppressWarning ...

  • Java学习-多线程

    多线程 任务(Task).进程(Process).线程(Thread) 进程的创建 1.继承Thread类 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用sta ...

  • Java并发编程之线程的创建

    简介 线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在.一个进程至少有一个线程,进程中的多个线程共享进程的资源. Java中创建线程的方式有多种如继承Thread ...

  • Java学习-Mybatis

    Mybatis Maven依赖: <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependenc ...

  • Java 学习笔记

    您对计算机(电脑)有了解吗? 计算机组成 系统软件 直接和硬件交互的软件叫系统软件,例如 win7.win8.Linux.mac等操作系统 应用软件 通常在运行在系统软件上,也就是在系统软件上开发的软 ...

  • Java学习-126.2048代码

    本篇帖的是按钮的代码. 因为按钮比较多,包括菜单项的动作,为了区分,我用了两个内部类来实现这两部分代码. //本类是Game_2048类的内部类,用来实现上.下.左.右四个按钮,以及重新开始和退出游戏 ...

  • Java学习—125.2048代码

    本篇帖的是部分动作代码. 每个方法前都有注释说明本方法的功能. //随机选取一个位置,并填入数字2.如果此位置中已有数字,那么换一个位置. public void rule(){ x=ran.next ...