Java Thread

一、什麼是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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:58
下一篇 2024-12-27 12:58

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論