[英]How can I have two threads working for my application
我還在學習Java,目前我正在使用線程,所以基本上我正在嘗試使用我們擁有帳戶的應用程序,現在我想使用兩個不同的線程。 一個人每1秒向賬戶增加一筆錢並顯示余額,另一個從賬戶中每1秒提取一定金額並顯示結果余額。 所以我創建了我的Account類,因此對象
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);}}
這是主要課程:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account Steve= new Account(10);
Add test= new Add(Steve);
Withdraw test1= new Withdraw(Steve);
test.start();
test1.start();
}}
問題是當我運行程序時,add方法完成它的工作,但是當它顯示輸出時結果不是我所期望的(當調用add方法時,余額是10,它應該顯示20但是我是得到11所以它顯示的結果考慮了撤銷方法的結果,這不是我想要的)
(當調用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
任何線程,因此執行塊內的所有操作,保持其他線程等待
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.