我还在学习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,所以它显示的结果考虑了撤销方法的结果,而这不是我想要的那样)
答案 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
的任何线程,因此执行块内的所有操作都会保持其他线程等待