黑馬程式設計師——java基礎之多執行緒
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
1. Java 多執行緒程式設計
Java 語言的優勢之一就是執行緒處理較為簡單。
一般作業系統都支援執行多個任務,一個任務通常就是一個程式,每個執行中的程式被稱為一個程序,當一個程式執行時,內部可能包含多個順序執行流,每個順序執行流就是一個執行緒。
1)程式:指令+資料的byte序列,如:qq.exe。
2)程序:正在執行的程式,是程式動態的執行過程(運行於記憶體中)。
3)執行緒:在程序內部,併發運程的過程(方法)。
4)併發:程序是併發進行的,OS將時間劃分為很多時間片段,盡肯能均勻分配給正在執行的程式,微觀上程序走走停停,巨集觀上都在執行,這種都執行的現象叫——併發,但是不是絕對意義上的“同時”。
2. 建立一個執行緒
1)Thread 類:執行緒包含一個可以執行的過程(方法),Thread 類中包含方法run()。
2)建立一個具體執行緒,需要繼承於 Thread 類。
3)覆蓋 run() 方法(就是更新執行過程),實現使用者自己的過程。
4)建立執行緒例項(一個執行緒)。
5)使用執行緒例項的 start() 方法啟動執行緒,啟動以後執行緒會盡快的去併發執行 run() 。
3. 執行緒的狀態
1)new新建
2)runnable 可執行(就緒)
3)running 執行(正在執行)
4)block 阻塞、掛起
5)dead 死亡
4. 執行緒狀態管理
1)讓出 CPU
Thread.yield() 當前執行緒讓出處理器(離開 running),使當前執行緒進入 runnable 等待。
2)休眠
Thread.sleep(times) 使當前執行緒從 running 放棄處理器進入 block 狀態,休眠 times 毫秒,再返回到 runnable,如果其他執行緒打斷當前執行緒的block(sleep),就會發生InterruptedException
5. 執行緒的常用屬性
1)執行緒的優先順序(資源緊張時候,儘可能優先)
t.setPriority(Thread.MAX_PRIORITY);
預設有 10 優先順序,優先順序高的執行緒獲得執行的機會多。
機會的多少不能通過程式碼干預。
預設優先順序是 5。
2)後臺執行緒(守護執行緒,精靈執行緒)
t.setDaemon(true);
Java 程序的結束:當前所有前臺執行緒都結束時,Java 程序結束後臺執行緒,不管是否結束,都被停掉!
3)執行緒名字
getName();
4)當前執行緒
Thread main = Thread.currentThread();
6. 建立執行緒的兩種方式
1)繼承 Thread 類
1 繼承 Thread 類,覆蓋 run() 方法,提供併發運程的過程。
2 建立這個類的例項。
3 使用 start() 方法啟動執行緒。
2)實現 Runnable 介面
1 實現 Runnable 介面,重寫 run() 方法,提供併發運程的過程。
2 建立這個類的例項,用這個例項作為 Thread 構造器引數,建立 Thread 類。
3 使用 start() 方法啟動執行緒。
class Person implements Runnable{
public void run(){
//...
}
}
Thread t = new Thread(new Person());
t.start();
3)使用 內部類/匿名類 建立執行緒
new Thread(){
public void run(){
System.out.println("Hi Thread");
}
}.start();
7. Sleep 的打斷喚醒
1)Thread.sleep(times) 使當前執行緒從 running 放棄處理器進入 block 狀態,休眠 times 毫秒,再返回到 runnable。
2)一個執行緒可以提前喚醒另外一個 sleep block 的執行緒,interrupt()打斷/中斷。
3)被喚醒執行緒出現 中斷異常
8. 非同步,同步
1)非同步:併發,各幹自動的,如:一群人上卡車。
2)同步:步調一致的處理,如:一群人上公交車。
9. 執行緒併發安全問題
1)多個執行緒併發讀寫同一個臨界資源時候會發生“執行緒併發安全問題”。
2)常見的臨界資源:
多執行緒共享例項變數
靜態公共變數
3)使用同步程式碼塊解決執行緒併發安全問題
synchronized(同步監視器){
}
1 同步監視器 是一個任意物件例項,是一個多個執行緒之間的互斥的鎖機制,多個執行緒要使用同一個“監視器”物件,實現同步互斥。
2 常見寫法:
synchronized(this){
}
3 如果方法的全部過程需要同步,可以簡單使用 synchronized 修飾方法,相當於整個方法的 synchronized(this)。
4 儘量減少同步範圍,提高併發效率。
10. Java 中同步的 API
StringBuffer , Vector 和 Hashtable 是同步的,StringBuilder,ArrayList 和 HashMap 不是同步的。
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流!
----------------------