java 線程

線程的實現方式有三種:

繼承Thread類實現線程;實現Runnable接口創建線程;以內部類的方式創建線程。

線程的啓動是通過調用線程對象start()方法,線程運行是從run()方法開始,當線程的run()方法結束後,線程運行結束。

下面舉一個用Thread類實現線程的方法:

從賬戶中取出cash,設定賬戶餘額爲5000,執行取出2500 和取出2600的操作

public class Account {
//賬戶餘額
private int total = 0;
//構造函數
public Account(int save){
total = save;
}
//取現方法

public  int getCash(int count){(1)
//public synchronized int getCash(int count){          (2)
                           
if(count>total){
return -1;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
total = total - count;
return count;
}


public static void main(String[] args){
Account a = new Account(5000);
CashThread ct = new CashThread("銀行卡",a, 2500);
CashThread ct1 = new CashThread("存摺",a, 2600);
ct.start();
ct1.start();
}

}

public class CashThread extends Thread{
private String user;
private Account a;
private int count;
//構造函數
public CashThread(String user,Account a,int count){
this.user = user;
this.a = a;
this.count =count;
}
//重寫run
public void run(){
int num = a.getCash(count);
System.out.println("從"+user+"取現:"+num);
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

當程序執行的是(1)語句

運行結果: 從存摺取現:2600
從銀行卡取現:2500

從銀行卡取現:2500

從存摺取現:2600

當程序執行(2)語句時

運行結果: 從存摺取現:-1
從銀行卡取現:2500

從銀行卡取現:-1
從存摺取現:2600


小結:1)運行結果會出現兩種情況是因爲線程是隨機分配資源,有可能先分配給線程ct,也可能先分配給線程ct1。

             2)運行(1)語句與運行(2)語句結果不同是由於“synchornized”,第一種賬戶只有5000卻能取出2500+2600=5100,是因爲線程沒有同步,在(2)語句中加入synchornized,問題就會解決,實際上就是解決了線程同步的問題。

java中,用synchornized關鍵字來實現互斥控制 把一個單元聲明爲synchornized,就可以讓在同一時間只有一個線程操作該方法

附:當一個線程結束後,線程對象再次啓動線程時必須重新創建新的線程對象。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章