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

Java 如何让两个线程为我的应用程序工作,java,multithreading,Java,Multithreading,我仍在学习Java,目前我正在使用线程,所以基本上我正在尝试做一个应用程序,其中我们有一个帐户,现在我想使用两个不同的线程。一个每1s向帐户中添加一笔钱并显示余额,另一个每1s从帐户中提取一定金额并显示结果余额。 因此,我创建了Account类,从而创建了object public class Account { private double money; public double getMoney() { return money; } public void setMoney(

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

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;
}}
我创建了两个类,一个添加ans,另一个提取ans

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,所以它显示的结果考虑了draw方法的结果,这不是我想要的)

(当调用add方法时,余额是10,它应该显示20,但我得到11,所以它显示的结果考虑了draw方法的结果,这不是我想要的

出现这种情况是因为两个线程并行工作,并且在显示添加结果之前运行了draw方法

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

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());
        }
    }

}
公共作废添加(账户obj,添加koi){
obj=obj;
这个.koi=koi;

while(obj.getMoney()在帐户上同步,而不是在提取或添加对象上同步!公共同步的void add(account obj,add koi)
是否应实际同步?此同步测试变量,而不是obj(Steve)变量我认为这是没有必要的,这样添加和提取可以交错。如果你的意思是从add和with方法中删除synchronize关键字,你是对的,它们在你的程序中是不必要的
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());
        }
    }
}