线程的状态、调度、同步
生活随笔
收集整理的這篇文章主要介紹了
线程的状态、调度、同步
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線程的狀態
- java中的線程共五個狀態:新建、就緒、運行、阻塞、死亡;
- 新建狀態(New):處于系統創建線程,但未啟動此線程,系統未為其分配資源。
- 就緒狀態(Runnable):線程調用start( )方法,線程轉為就緒狀態,線程獲取(除CPU以外)系統資源。同時該線程位于可運行線程池中,變得可運行,等待調度程序調度。
- 運行狀態(Running):線程獲得CPU時間,進入運行狀態,開始執run()方法。
- 阻塞狀態(Blocked):系統讓出CPU進入阻塞狀態,可根據特定的方法返回可運行狀態。
- 死亡狀態(Dead):線程執行完畢或異常退出run( )方法,線程結束生命周期。
線程的調度
-
在多個CPU的計算機中,線程數多余CPU的個數,為了防止因線程爭奪資源,而導致系統死機或崩潰,Java中定義了線程的優先級控制和調整策略。
-
優先級控制: Java將優先級分為10個等級,數字越大優先級越高。靜態常量MIN_PRIORITY、NORMAL_PRIORITY、MAX_PRIORITY;
- void setPriority(int newPriority):設置(改變)線程的優先級。
- int getPriority():得到線程的優先級。
-
線程的調度策略:
1.分時調度模型:線程輪流獲取cpu的使用權,采用時間片均勻分配的方式。
2.搶占式調度模型:以優先級高的線程占用CPU為標準,直至線程自己放棄。
注:Java虛擬機采用搶占式調度模型 -
參考代碼:
public class PriorityTest {public static void main(String[] args){PriorityTestThree r = new PriorityTestThree();Thread testOne = new Thread(r,"線程1");// 設置優先級testOne.setPriority(Thread.NORM_PRIORITY - 2);testOne.start();Thread testTwo = new Thread(r,"線程2");// 設置優先級testTwo.setPriority(Thread.NORM_PRIORITY + 2);testTwo.start();} static class PriorityTestThree implements Runnable{public void run() {// TODO Auto-generated method stubfor(int i = 0; i<4;i++){System.out.println(Thread.currentThread().getName() + ":" +i);}System.out.println(Thread.currentThread().getName() + ":完成!");}}}
- 控制臺輸出結果:
線程2:0
線程2:1
線程2:2
線程2:3
線程1:0
線程2:完成!
線程1:1
線程1:2
線程1:3
線程1:完成!
線程的同步
-
線程同步: 指當一個臨界資源被線程訪問時,其它線程不能對該資源訪問;直至該線程訪問結束,其他線程才方可訪問該臨界資源。
-
適用場景: 一些敏感資源不能被多個線程臨時訪問時,適用同步訪問技術,來保障數據的安全性和準確性。
-
同步化的兩種方法: 同步方法和同步代碼塊。
- 同步方法:使用
synchronized關鍵字修飾需要同步的方法。該方法會自動被加上內置鎖。public synchronized 類型 方法名(參數表) { // 方法體 } - 同步代碼塊:即用
synchronzied關鍵字修飾的語句塊,該語句塊會自動被加上內置鎖。synchronize (object){ // 語句塊 }
- 同步方法:使用
-
以銀行存款為例:
- 參考代碼:
public class BankThreadTest implements Runnable {private static Bank bank;BankThreadTest(Bank bank){ this.bank = bank;}public void run(){for(int i=0;i<3;i++){bank.save(100);}}public static void main(String[] args){bank = new Bank();BankThreadTest s = new BankThreadTest(bank);Thread threadOne = new Thread(s);threadOne.start();Thread threadTwo = new Thread(s);threadTwo.start();}static class Bank{private int money = 0;// 設置同步方法public synchronized void save(int money){int temp = this.money;temp += money;try{// 設置休眠時間Thread.sleep((int)(Math.random()*1000));}catch(InterruptedException e){e.printStackTrace();}this.money = temp;String n = Thread.currentThread().getName();System.out.println(n + ":存入"+ money + "元,賬戶余額為:"+ this.money);}}
}
- 控制臺輸出結果:
Thread-0:存入100元,賬戶余額為:100
Thread-0:存入100元,賬戶余額為:200
Thread-0:存入100元,賬戶余額為:300
Thread-1:存入100元,賬戶余額為:400
Thread-1:存入100元,賬戶余額為:500
Thread-1:存入100元,賬戶余額為:600
- 不使用
synchronized方法下的代碼:
public class BankThreadTest implements Runnable {private static Bank bank;BankThreadTest(Bank bank){this.bank = bank;}public void run(){for(int i=0;i<3;i++){bank.save(100);}}public static void main(String[] args){bank = new Bank();BankThreadTest s = new BankThreadTest(bank);Thread threadOne = new Thread(s);threadOne.start();Thread threadTwo = new Thread(s);threadTwo.start();}static class Bank{private int money = 0;public void save(int money){//synchronizedint temp = this.money;temp += money;try{Thread.sleep((int)(Math.random()*1000));}catch(InterruptedException e){e.printStackTrace();}this.money = temp;String n = Thread.currentThread().getName();System.out.println(n + ":存入"+ money + "元,賬戶余額為:"+ this.money);}}
}
- 控制類輸出結果:
Thread-1:存入100元,賬戶余額為:100
Thread-0:存入100元,賬戶余額為:100
Thread-1:存入100元,賬戶余額為:200
Thread-0:存入100元,賬戶余額為:200
Thread-1:存入100元,賬戶余額為:300
Thread-0:存入100元,賬戶余額為:300
總結
以上是生活随笔為你收集整理的线程的状态、调度、同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android数据持久化:SharePr
- 下一篇: Git 基本指令