簡體   English   中英

如何讓兩個線程為我的應用程序工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM