Java-這張執行緒瓜圖保熟,不進來看看?

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

Java-這張執行緒瓜圖保熟,不進來看看?

看不懂沒關係,慢慢來學習,往下學習來繼續瞭解一下~

什麼是執行緒?

執行緒是程序的一部分,是程式執行中的一條執行路線;

程序就是指程式在其自身地址空間的一次執行活動,是程式獨立執行的基本單位;

一個程序可以包含多條執行緒,一條執行緒對應一個程序中的一條執行路線。

Java-這張執行緒瓜圖保熟,不進來看看?

執行緒的幾種建立方式?

主要由四種方式建立執行緒:

Java-這張執行緒瓜圖保熟,不進來看看?

方式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 ft = new FutureTask<>(new Callable() { @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 future = pool。submit(new Callable(){ @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資源,並且釋放鎖資源,進入就緒狀態。

Java-這張執行緒瓜圖保熟,不進來看看?

執行緒相關的核心方法及作用?

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://blog。csdn。net/JustinQin/article/details/120633890