Java中的執行緒-1
支援多執行緒程式設計是Java語言不同與其他語言的優點。
1 :什麼是執行緒?
在回答這個問題之前,先要了解什麼是程式。
程式是程式在資料集合上的一次執行過程,是資源申請,排程和獨立執行的單位。(現在是不是有點暈,沒事,舉個列子就理解了)比如:在電腦中你可以同時開啟QQ,播放器等等應用程式。實際在作業系統中就是建立了對應的程式。對於單CPU的計算機來講,同一時刻只有一個程式在運作,不是全部運作,它們是通過短時間的交替來執行。時間比較短,所以就感覺是一塊執行。
執行緒是程式的基本單位。是一個獨立執行線索,一個程式最少包含一個執行緒。程式執行時,真正起作用的是執行緒。執行緒又稱為輕量級程式,它和程式一樣擁有獨立的執行控制,不一樣的是執行緒沒有獨立的儲存空間,和所屬程式中其他執行緒公用一個儲存空間。
2 : 執行緒的概念模型
a:虛擬的CPU(封裝在java.lang.Thread類)
b:CPU所執行的程式碼
c:CPU所需要的變數
3:執行緒的建立
有兩種方式
a:繼承Thread類。
b:實現Runnable介面。
4 :Thread類中的主要方法
public Thread()——構造方法,建立一個Thread物件,名字預設為Thread-n,根據建立的先後順序。n從0開始。
public Thread(String name)——構造方法,建立一個名字為name的Thread物件
public Thread(Runnable target)——構造方法,建立一個新的實現Runnable介面的執行緒類,
public Thread(Runnable target ,String name)——構造方法,建立一個新的實現了Runnable介面的執行緒類,同時設定名字為name
public long getId()——返回該執行緒的唯一ID
public void run()——執行緒體,此執行緒所有的程式碼都在其中寫。此方法不能被顯性呼叫,只能由JVM呼叫,呼叫執行緒的start()方法時,JVM會呼叫run()方法。
public void start()——呼叫此方法,JVM會呼叫run() 方法。
public void join()——當前執行緒執行某一執行緒的此方法,當前執行緒等到該執行緒執行完後才能執行
public static void slep(long mills)——執行緒休眠,休眠時間為mills,休眠時不釋放所佔有的資源.
public static void yield()——暫停當前正在執行的執行緒物件,並執行其他執行緒。該執行緒直接進入就緒狀態。
這是主要的幾個,還有好多的方法參考javaAPI
這個例子是繼承Thread
這個例子是實現Runnable介面
(實現Runnable介面的類,稱為執行緒類,這個類是不能作為執行緒啟動的,必須通過Thrad構造方法進行“深加工”後在可以。這個方法可以創造多個執行緒物件,但執行的執行緒體都是一樣的。)
5 : 執行緒的狀態
三個階段
a:新建(New)new 出一個新物件
b: 就緒 (Runnable) 新建狀態的物件呼叫start()方法,物件進入就緒狀態。
c:執行 (Running) 就緒狀態的物件,獲得CPU分配的時間片進入執行狀態,處於執行狀態的物件,可以通過不同的方式進入不同的狀態。
d: 阻塞 (Blocked)。阻塞分為三個狀態 wait等待池阻塞(Blocked in object wait pool) lock等待池阻塞(Blocked in lock pool)和其他阻塞(Otherwise Blocked)
e:死亡 (Dead)
狀態轉移具體如下
1.處於執行狀態的執行緒物件的run()或著main()方法結束後,執行緒就進入死亡(程式執行完成而執行終止)狀態
2.處於執行狀態的執行緒物件,當執行緒物件呼叫了自身的sleep()方法或者其他的執行緒的jion()方法,或者發出I/O請求,就會進入阻塞狀態(該狀態即停止當前執行緒,但並不會釋放自己擁有的資源)當sleep()結束或者jion()結束或者I/O操作結束後 或者 呼叫執行緒的interupt方法,該執行緒進入就緒狀態,繼續等待OS分配時間塊。
3.處於執行狀態的執行緒物件,當執行緒呼叫yield()方法,放棄當前獲得的CPU時間片,或者時間片用完執行緒還沒結束,執行緒物件回到就緒狀態,這時與其他程式處於同一起跑線,OS可能會繼續讓他進入執行狀態。
4.當執行緒物件剛進入執行狀態,但還沒執行,發現執行緒執行需要的資源被(synchronized)同步,並獲取不到鎖標記,將會立即進入阻塞(鎖等待池)狀態,登臺獲取鎖標記,一旦執行緒獲得標記,就進入就緒狀態,等待OS分配CPU時間片。
5.處於執行狀態的執行緒物件,當執行緒呼叫wait()方法後,會進入阻塞(等待佇列)狀態,釋放它所佔有的資源,這個狀態不能主動喚醒,必須依靠其他執行緒呼叫notify()或者notifyAll()方法,才能被喚醒。由於notify只能喚醒一個執行緒,但不能確定具體喚醒的是哪一個執行緒,一般呼叫notifyAll()方法,執行緒喚醒後進入鎖池,等待獲取鎖標記。
相關文章
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java執行緒:執行緒中斷Java執行緒
- Java中的執行緒Java執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- Java多執行緒1:程式與執行緒概述Java執行緒
- JAVA中執行緒的建立Java執行緒
- Java中的執行緒同步Java執行緒
- Java中的多執行緒Java執行緒
- Java執行緒的中斷Java執行緒
- JAVA中的執行緒世界Java執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- Java多執行緒-1(3)Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- 中斷JAVA執行緒Java執行緒
- Java 中的執行緒 threadJava執行緒thread
- Java中多執行緒的案例Java執行緒
- java中執行緒安全的集合Java執行緒
- 理解Java執行緒的中斷Java執行緒
- Java 程式中的多執行緒Java執行緒
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- 徹底明白Java的多執行緒-執行緒間的通訊(1)(轉)Java執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- Java執行緒面試題(02) Java執行緒中如何避免死鎖Java執行緒面試題
- Java 可中斷執行緒Java執行緒
- Java多執行緒——執行緒Java執行緒
- 【JUC】1-Java執行緒的啟動Java執行緒
- Java中實現執行緒的方式Java執行緒
- 聊聊面試中的 Java 執行緒池面試Java執行緒
- Java的Interrupt與執行緒中斷Java執行緒
- 淺析Java中的執行緒池Java執行緒
- JAVA執行緒中的安全知識Java執行緒
- Java中的多執行緒詳解Java執行緒
- Java中的執行緒同步詳解Java執行緒
- 執行緒1-單執行緒執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- Java執行緒篇——執行緒的開啟Java執行緒