如何让两个线程为我的应用程序工作

时间:2016-06-18 07:42:33

标签: java multithreading

我还在学习Java,目前我还在学习线程,所以基本上我正在尝试做一个我们有帐户的应用程序,现在我想使用两个不同的线程。一个人每1秒向账户增加一笔钱并显示余额,另一个从账户中每1秒提取一定金额并显示结果余额。 所以我创建了我的Account类,因此创建了对象

for (int i = 0; i < Array.Length / 2; i++)

我创建了两个类,一个添加了另一个撤回

public class Account {
private double money;

public double getMoney() {
    return money;
}

public void setMoney(double money) {
    this.money = money;
}

Account (double money){
    this.money=money;
}}

这是主要课程:

public class Add extends Thread {
Account obj;
Add koi;
Add(Account obj){
    this.obj=obj;
}
public synchronized void add(Account obj, Add koi){
    this.obj=obj;
    this.koi=koi;
    while(obj.getMoney()<100){
double top= obj.getMoney()+10;
obj.setMoney(top);
System.out.println("The balance is : "+obj.getMoney());
try{
    Thread.sleep(1000);
    }
    catch(Exception e){
        System.out.println(e.toString());
    }}
}public void run(){
    add(obj,koi);}}



public class Withdraw extends Thread{
Account obj;
Withdraw koi;
Withdraw(Account obj){
    this.obj=obj;
}
public synchronized void with(Account obj, Withdraw koi){
    this.koi=koi;
    this.obj=obj;
    while (obj.getMoney()<100){
double top= obj.getMoney()-9;
obj.setMoney(top);
System.out.println("The balance is : "+obj.getMoney());
try{
    Thread.sleep(1000);
    }
    catch(Exception e){
        System.out.println(e.toString());
    }}
}public void run(){
  with(obj,koi);}}

问题是当我运行程序时,add方法完成它的工作,但是当它显示输出时,结果不是我所期望的(当调用add方法时,余额为10,它应该显示20但是我得到了11,所以它显示的结果考虑了撤销方法的结果,而这不是我想要的那样)

1 个答案:

答案 0 :(得分:3)

  

(当调用add方法时,余额为10,它应该显示20但是我得到11,所以它显示的结果考虑了撤销方法的结果而且不是我想要的是什么

这是因为两个线程并行工作,并且在显示添加结果之前运行withdraw方法。

我认为实现所需结果的唯一解决方案是同步共享对象上的函数:如下所示:

public void add(Account obj, Add koi){
    this.obj=obj;
    this.koi=koi;
    while(obj.getMoney()<100)
    {
        synchronized(obj)
        {
            double top= obj.getMoney()+10;
            obj.setMoney(top);
            System.out.println("The balance is : "+obj.getMoney());
        }
        try{
            Thread.sleep(1000);
        }
        catch(Exception e){
            System.out.println(e.toString());
        }
    }

}

public void with(Account obj, Withdraw koi){
    this.koi=koi;
    this.obj=obj;
    while (obj.getMoney()<100)
    {
        synchronized(obj) 
        {
            double top= obj.getMoney()-9;
            obj.setMoney(top);
            System.out.println("The balance is : "+obj.getMoney());
        }
        try{
            Thread.sleep(1000);
        }
        catch(Exception e){
            System.out.println(e.toString());
        }
    }
}

synchrnozed(obj)运算符锁定访问变量obj的任何线程,因此执行块内的所有操作都会保持其他线程等待