<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • java多線程有幾種實現方式(免費分析這5種實現方式)


    前言

    多線程(multithreading),是指從軟件或者硬件上實現多個線程并發執行的技術。具有多線程能力的計算機因有硬件支持而能夠在同一時間執行多于一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理或同時多線程處理器。在一個程序中,這些獨立運行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理” 。

    Java多線程有哪幾種實現方式?如何實現?

    一、生活中多線程的例子

    • 城市發展:
      • 鄉村小道:可以理解為典型的單線程,當車流量較少時,可以正常同行,不會影響效率。
    Java多線程有哪幾種實現方式?如何實現?
    • 高速公路:當車流量大了之后,鄉村小路開始變得擁堵,人們為了解決這個問題,就拓寬馬路,增加車道,抽象的理解為,多線程同時工作。
    Java多線程有哪幾種實現方式?如何實現?
    • 實際生活中例子數不勝數,比如:吃飯時變玩手機邊吃飯,邊上廁所邊玩手機。

    二、進程和線程

    程序:

    • 程序是一個指令序列。
    • 程序是靜態的。

    進程:

    • 進程就是執行程序的一次性過程。相當于一整條高速公路。
    • 一個線程可以包含多個線程,當然,最少有一個線程,不然這個進程毫無意義

    線程:

    • 線程相當于獨立的執行路徑。相當于高速公路的每一條車道。
    • 在程序執行中,即使你沒有創建線程,也會有默認的線程,如:main,gc等。
    • main() 函數 被稱為主線程,是整個程序的入口。
    • 在一個線程當中,如果有多個進程,具體的調度是無法人為干預的,是由cpu來調度的。
    • 多個線程對同一個資源進行操作時,可能會發生錯誤,需要加入并發控制。

    上面都是一些理論的知識,有些枯燥,理解記憶即可。。

    三、繼承Tread類

    實現方式:

    • 繼承Tread類
    • 重寫run方法
    • 創建實例調用start()方法

    實現代碼案例:

    /**
     * 多線程的實現方式一 :繼承Tread類,并重寫run方法,創建實例調用start方法
     */
    public class TestTread extends Thread{
    
        //idea中快速重現父類方法的快捷鍵是 ctrl + o
        @Override
        public void run() {
            System.out.println("我是一個線程呀~~~~");
        }
    
        public static void main(String[] args) {
            //實例化線程實現類
            TestTread testTread = new TestTread();
            //使用start()方法啟動該線程,無需調用run方法,因為在線程中他會默認調用run()方法,也就是啟動后會自動執行run()方法
            testTread.start();
        }
    }

    執行結果如下:

    Java多線程有哪幾種實現方式?如何實現?

    四、實現Runnable接口

    • 實現Runnable接口
    • 重寫run()方法
    • 創建Thread時作為參數傳入
    • 用start方法

    代碼實現案例:

    /**
     * 多線程的實現方式二 :實現Runnable接口,并重寫run方法,創建Thread時作為參數傳入,調用start方法
     */
    public class TestRunnable implements Runnable{
        public static void main(String[] args) {
            //分開寫
            TestRunnable testRunnable = new TestRunnable();
            Thread tread = new Thread(testRunnable);
            tread.start();
    
            //簡寫
            new Thread(new TestRunnable()).start();
        }
        //和Thread一樣,需要重寫run()方法
        @Override
        public void run() {
            System.out.println("我也是一個線程呀~~~");
        }
    }

    執行結果如下:

    Java多線程有哪幾種實現方式?如何實現?

    五、實現Callable接口

    • 實現Callable接口
    • 重寫call方法
    • 必須定義返回值
    • 拋出異常
    • ExecutorService :不展開講,后面的文章會詳細介紹
    • shutdown():停止接收新任務,原來的任務繼續執行
    • shutdownNow():停止接收新任務,原來的任務停止執行
    • awaitTermination(long timeOut, TimeUnit unit):當前線程阻塞

    代碼實現案例:

    /**
     * 多線程的實現方式三:實現Callable接口,重寫call方法
     * 需要有返回值
     */
    public class TestCallable implements Callable<String> {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            TestCallable testCallable = new TestCallable();
    
            //創建執行服務,這是相當于線程池,本篇文章不展開講,后面會詳細介紹這幾個參數和使用方法
            ExecutorService service = Executors.newFixedThreadPool(1);
    
            //執行
            Future<String> result = service.submit(testCallable);
    
            //可獲取線程的返回值
            String result1 = result.get();
            System.out.println("我是線程的返回值:"+result1);
    
            //停止線程
            service.shutdownNow();
        }
    
        @Override
        public String call() throws Exception {
            System.out.println("我當然也是一個線程啦啦啦啦德瑪西亞~~~");
            return "我是一個線程";
        }
    }

    執行結果如下:

    Java多線程有哪幾種實現方式?如何實現?

    六、總結

    • 線程只是實現Runnable或實現Callable接口,還可以繼承其他類。
    • 這種方式下,多個線程可以共享一個target對象,非常適合多線程處理同一份資源的情形。
    • 但是編程稍微復雜,如果需要訪問當前線程,必須調用Thread.currentThread()方法。下一篇詳解。
    • 繼承Thread類的線程類不能再繼承其他父類(Java單繼承決定)。
    • 注:一般推薦采用實現接口的方式來創建多線程,因為單繼承多實現,提高復用性!

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费