執行緒的基本介紹 二
1.執行緒的幾種狀態:
在前面介紹了執行緒的幾種建立方式,現在介紹一下執行緒的幾種狀態: 新建、就緒、執行、阻塞、死亡。
新建狀態:
執行緒被創建出來,還沒有執行start() 方法開始執行,此時處於新建狀態。
就緒狀態:
執行緒並不會自動執行過,當呼叫執行緒的start() 方法之後,執行緒進入就緒狀態。處於就續狀態的方法並不一定會執行run() 方法,需要和其他的執行緒競爭CPU時間。
執行狀態:
噹噹前的執行緒獲取到CPU時間,此時開始到執行狀態,開始執行run()方法。
阻塞狀態:
阻塞狀態會有多中情況會導致:
當前執行緒試圖去獲取到另外一個執行緒所持有的鎖,會進入阻塞狀態。
線上程執行過程當中呼叫sleep方法,或阻塞一段時間.
在同步方法中呼叫wait() 會使當前的執行緒釋放鎖,進入等待狀態,直到獲取到notify() 或者 notifyAll() 。
當前執行緒正在進行一些阻塞的操作,例如IO讀操作或者IO寫。
死亡狀態:
當前執行緒執行完run() 方法 會正常死亡。
線上程執行過程當中發生異常,會非正常死亡。
2.執行緒當中幾個常用到的屬性:
name: 指定當前執行緒的名字,便於檢視
id: 執行緒的標識
priority: 優先順序 1-10 高優先順序的執行緒有較大的概率優先執行。
daemon: 是否為守護執行緒 守護執行緒的作用是為其他的執行緒提供服務。
3. Object類中和執行緒相關的幾個方法:
notify(): 喚醒在此物件監視器上等待的單個執行緒
notifyAll():喚醒在此物件監視器上等待的所有執行緒
wait(): 呼叫此方法會使執行緒進入等待狀態,直到其他執行緒呼叫此物件的notify() 或者 notifyAll()
還有兩個wait()方法的過載,需要指定時間,一個時間單位為毫秒,另一個時間單位為納秒。
4.什麼是執行緒的死鎖? 如何導致死鎖?
死鎖: 兩個以上的執行緒需要互相實用對方已經佔有的資源,而導致無法執行的現象
通俗點來說就是在當前的執行緒在佔有鎖的同時請求獲取另外一個鎖,而此時正好有一個執行緒佔有另外一個鎖而需要請求當前執行緒佔有的鎖。
一個死鎖的簡單例項:
package com.wc.study.thread.demo2;
public class CreateThread {
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(()->{
synchronized(o1){
System.out.println(Thread.currentThread().getName() + "佔有了o1");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println(Thread.currentThread().getName() + "佔有o2");
}
}
});
Thread thread2 = new Thread(()->{
synchronized(o2){
System.out.println(Thread.currentThread().getName() + "佔有了o2");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println(Thread.currentThread().getName() + "佔有o1");
}
}
});
thread1.start();
thread2.start();
}
}
執行結果: