一、什麼是Java Thread
Java Thread是指Java里的線程。線程是程序執行的一條路線,使得程序可以同時運行多個任務。與進程不同,線程在同一時間內只能有一個被執行,但是CPU可以在多條線程之間快速切換。Java線程是輕量級的,因為它們都是由線程控制器來管理的。
二、Java Thread的創建
Java Thread的創建有兩種方式。第一種是繼承Thread類,第二種是實現Runnable接口。
1、繼承Thread類
public class MyThread extends Thread{ public void run(){ //指定任務內容 } }
創建線程實際上就是創建一個MyThread對象,而這個對象中的run()方法就是要執行的任務內容。調用start()方法後,線程就會被啟動並執行run()方法。
2、實現Runnable接口
public class MyRunnable implements Runnable{ public void run(){ //指定任務內容 } }
創建線程時需要傳入一個Runnable對象。Runnable對象中的run()方法就是要執行的任務內容。和繼承Thread類不同,在實現Runnable接口時,一個對象可以被多個線程共享,從而達到線程共享數據的效果。
三、Java Thread的同步
在多線程執行的過程中,如果多個線程同時對同一個數據進行修改,就會出現數據不一致的問題。為了解決這個問題,就需要對線程進行同步。
1、synchronized關鍵字
synchronized關鍵字用於保護一個臨界區,使得只能有一個線程進入臨界區進行操作,其他線程則需要等待。synchronized關鍵字可以用在方法上或者代碼塊中,用法如下:
1.1、方法上鎖
public synchronized void doSomething(){ //需要同步的代碼 }
1.2、代碼塊中鎖
public void doSomething(){ synchronized(this){ //需要同步的代碼 } }
2、volatile關鍵字
volatile關鍵字用於保證線程中變量的可見性。當一個變量聲明為volatile時,在一個線程中對該變量的修改會馬上被其他線程可見。在Java內存模型中,volatile變量可以被看作是一種比synchronized更輕量級的同步機制。用法如下:
public volatile boolean flag = true;
四、Java Thread的狀態
Java Thread一共有6種狀態:新建狀態、就緒狀態、運行狀態、阻塞狀態、等待狀態和死亡狀態。
1、新建狀態
線程創建後處於新建(New)狀態。此時線程還沒有被啟動,也還沒有分配到操作系統資源。這時線程已經進入了Java虛擬機的線程等待隊列中。
2、就緒狀態
當線程被啟動後,進入了就緒(Runnable)狀態。此時線程已經被分配到了操作系統資源,但它還沒有取得CPU執行權。這時線程已經進入了Java虛擬機的線程就緒隊列中。
3、運行狀態
當線程獲得了CPU執行權後,就處於運行(Running)狀態。此時線程正在執行任務的代碼。
4、阻塞狀態
當線程調用了sleep()、wait()、join()等方法時,它進入了阻塞(Blocked)狀態。在這種狀態下,線程仍然佔有操作系統分配的資源,但它不會執行任何代碼,處於靜止狀態。只有當sleep()時間到、wait()條件滿足或join()連接結束,阻塞狀態的線程才會重新進入到就緒狀態中。
5、等待狀態
當線程調用了wait()、join()等方法後,並且沒有指定等待時間,線程會進入等待(Waiting)狀態,此狀態下線程會釋放它所佔有的所有資源。線程只有在接收到notify()或notifyAll()消息後,才會重新進入到就緒狀態中。
6、死亡狀態
當線程的run()方法執行結束後,線程進入了死亡(Dead)狀態。這個線程不能再重新啟動,它的所有資源都會被釋放。
五、Java Thread常用方法
Java Thread提供了一些非常常用的方法,我們可以根據需求來靈活運用。
1、start()方法
start()方法是真正啟動一個線程的方法。當調用了start()方法後,線程就會開始執行,執行的內容是run()方法中的內容。
2、join()方法
join()方法使得調用該方法的線程優先執行,而其他線程等到該線程執行完成後再繼續執行。
public class MyThread extends Thread{ public void run(){ System.out.println("線程執行開始"); try{ Thread.sleep(5000); }catch(Exception e){ } System.out.println("線程執行結束"); } } public static void main(String[] args){ MyThread myThread = new MyThread(); myThread.start(); try{ myThread.join(); }catch(Exception e){ } System.out.println("主線程執行結束"); }
以上代碼將輸出以下內容:
線程執行開始 線程執行結束 主線程執行結束
3、yield()方法
yield()方法是暫停當前正在執行的線程對象,並執行其他線程。
public static void main(String[] args){ new Thread(){ public void run(){ System.out.println("線程1開始執行"); Thread.yield(); System.out.println("線程1結束執行"); } }.start(); new Thread(){ public void run(){ System.out.println("線程2開始執行"); System.out.println("線程2結束執行"); } }.start(); }
以上代碼將輸出以下內容:
線程1開始執行 線程2開始執行 線程2結束執行 線程1結束執行
4、sleep()方法
sleep()方法使得調用該方法的線程暫停指定的時間,讓其他線程有機會執行。
public static void main(String[] args){ new Thread(){ public void run(){ System.out.println("線程1開始執行"); try{ Thread.sleep(5000); }catch(Exception e){ } System.out.println("線程1結束執行"); } }.start(); new Thread(){ public void run(){ System.out.println("線程2開始執行"); System.out.println("線程2結束執行"); } }.start(); }
以上代碼將輸出以下內容:
線程1開始執行 線程2開始執行 線程2結束執行 線程1結束執行
六、Java Thread的異常處理
線程在執行過程中可能會發生異常,為了保證線程能夠正常運行,需要對線程執行代碼進行異常處理。Java Thread的異常處理通常使用try-catch-finally語句。
public static void main(String[] args){ Thread thread = new Thread(){ public void run(){ try{ //需要執行的代碼 }catch(Exception e){ //異常處理的代碼 }finally{ //釋放資源的代碼 } } }; }
七、Java Thread的線程池
Java ThreadPoolExecutor是Java中線程池的實現。線程池是一種能夠提高程序效率和穩定性的資源管理機制。在使用線程池的時候,一般需要指定線程數量和等待隊列的長度。
public static void main(String[] args){ ExecutorService executorService = Executors.newFixedThreadPool(10); for(int i=0;i<100;i++){ executorService.execute(new Runnable(){ public void run(){ //執行代碼 } }); } executorService.shutdown(); }
八、總結
Java Thread是實現多線程的重要機制,在我們的日常開發中有着非常廣泛的應用。本文從Java Thread的創建、同步、狀態、常用方法、異常處理和線程池6個方面詳細講述了Java Thread的知識點,可以幫助讀者更好地掌握Java Thread的使用方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/296231.html