先來看一下執行緒這張圖執行緒的幾種運行狀態之間運行流程:

看不懂沒關系,慢慢來學習,往下學習來繼續了解一下~
什么是執行緒?
- 執行緒是行程的一部分,是程式執行中的一條執行路線;
- 行程就是指程式在其自身地址空間的一次執行活動,是程式獨立運行的基本單位;
- 一個行程可以包含多條執行緒,一個條執行緒對應一個行程中的一條執行路線,
執行緒的幾種創建方式?
主要由四種方式創建執行緒:

- 方式1:繼承Thread類,重寫run(),無回傳值
- 方式2:實作Runnable介面,重寫run(),無回傳值
- 方式3:新建FutureTask + 實作Callable介面,重寫call(),有回傳值
- 方式4:通過Executors工具類創建執行緒池 + 呼叫submit + 重寫Callable介面,重寫call(),有回傳值
具體每一種創建方式說明及代碼實作如下:
/**
* 創建Thread執行緒的四種方式之內部類寫法
*/
public class NewThread {
public static void main(String[] args) throws Exception {
//方式1
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("方式1:繼承Thread類并重寫run()方法創建執行緒,無回傳值");
}
};
t1.start();
Thread.sleep(1000);
//方式2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("方式2:實作Runnable介面并重寫run()方法創建執行緒,無回傳值");
}
});
t2.start();
Thread.sleep(1000);
//方式3
FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
String result = "方式3:實作Callable介面并重寫call()方法新建FutureTask物件作為new Thread實體化引數創建執行緒,有回傳值";
return result;
}
});
Thread t3 = new Thread(ft);
t3.start();
System.out.println(ft.get()); //輸出回傳值
Thread.sleep(1000);
//方式4
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<String> future = pool.submit(new Callable<String>(){
@Override
public String call() throws Exception {
String result = "方式4:通過工具類Executors創建執行緒池,呼叫submit新建Future物件并重寫Callable介面重寫call()方法創建執行緒,有回傳值";
return result;
}
});
pool.shutdown();//關閉執行緒池
System.out.println(future.get()); //輸出回傳值
}
}
執行緒的幾種狀態?
- 新建(new):通過上面介紹的某種方式新建執行緒即處于新建狀態;
- 就緒(Ready):呼叫執行緒的start()方法,首先進入就緒狀態,等待獲取CPU時間;
- 運行(Running):就緒狀態的執行緒獲取到CPU時間或阻塞狀態的執行緒恢復都可進入運行狀態;
- 阻塞(Blocked):運行狀態的執行緒可能因為IO阻塞或在synchronized同步代碼塊中都可進入阻塞狀態;
- 死亡(Dead):正常運行的執行緒執行結束或就緒狀態的執行緒直接呼叫stop()方法就會進入死亡狀態;
- 睡眠(Sleeping):呼叫sleep方法指定執行緒睡眠多久,會釋放CPU資源,但不釋放鎖資源,睡眠時間到后會重新進入就緒狀態;
- 等待(Waiting):呼叫wait會讓執行緒短暫的處于等待中,會釋放CPU資源,并且釋放鎖資源,進入就緒狀態,
執行緒相關的核心方法及作用?
- start:呼叫start()方法底層原始碼會判斷執行緒狀態是否是新建狀態,不是則直接拋例外,并且后續會呼叫一個native本地方法start0,其底層通過JVM來進行調度最后呼叫run()方法執行;
- run:呼叫run()方法,底層會直接進入到重寫的run()方法并執行代碼塊內容;
- sleep:屬于Thread類的一個native本地static靜態方法,可以在任何地方呼叫sleep(1000)方法,期間會讓當前執行緒進入睡眠狀態1秒鐘,并讓出CPU資源,但不釋放鎖資源
- wait:屬于Object類的一個方法,只能在synchronized同步塊中進行呼叫wait(1000)方法,期間會讓當前執行緒進入等待狀態1秒鐘,不僅會讓出CPU時間,還釋放并釋放物件鎖資源
- yield:跟sleep一樣,也是Thread類的一個native本地static靜態方法,與sleep的最大區別在于Thread.yield()不需要指定暫停時間,并不會阻塞執行緒,而是進入就緒狀態,短暫的讓出CPU資源,這份CPU資源可能自己會再次獲取到,這個取決于調度器;
- notify:同wait一樣,也是屬于Object類的一個方法,作用是可以將wait()后等待的執行緒進行單個喚醒,并進入Read就緒狀態;
- notifyAll:同notify一樣,也是屬于Object類的一個方法,作用將當前物件上的所有等待執行緒喚醒,并進入Read就緒狀態;
- stop:該方法已被廢棄,不建議使用,該方法的作用是直接將執行緒結束,進入死亡狀態;
- interrupt:沖斷執行緒,不保證執行緒進入死亡、就緒還是繼續運行,不想stop可以直接沖斷一個正在運行的執行緒,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/306425.html
標籤:java

