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