中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java并發編程之線程怎么創建

發布時間:2022-04-18 15:20:30 來源:億速云 閱讀:99 作者:iii 欄目:開發技術

本篇內容主要講解“Java并發編程之線程怎么創建”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java并發編程之線程怎么創建”吧!

1.線程與進程

進程是代碼在數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,線程則是一個實體,一個進程中至少有一個線程,是CPU調度和分配的基本單位,進程中的多個線程共享進程的資源。

進程的三個特征:

  • 動態性 : 進程是運行中的程序,要動態的占用內存,CPU和網絡等資源。

  • 獨立性 : 進程與進程之間是相互獨立的,彼此有自己的獨立內存區域。

  • 并發性 : 假如CPU是單核,同一個時刻其實內存中只有一個進程在被執行。CPU會分時輪詢切換依次為每個進程服務,因為切換的速度非常快,給我們的感覺這些進程在同時執行,這就是并發性。

2.線程的創建與運行

我們在進程中創建線程的方式有三種:

  • 方式一:繼承Thread類的方式

  • 1.定義一個線程類繼承Thread類。

  • 2.重寫run()方法

  • 3.創建一個新的線程對象。

  • 4.調用線程對象的start()方法啟動線程。

public class ThreadDemo {
    // 啟動后的ThreadDemo當成一個進程。
    // main方法是由主線程執行的,理解成main方法就是一個主線程
    public static void main(String[] args) {
        // 3.創建一個線程對象
        Thread t = new MyThread();
        // 4.調用線程對象的start()方法啟動線程,最終還是執行run()方法!
        t.start();

        for(int i = 0 ; i < 100 ; i++ ){
            System.out.println("main線程輸出:"+i);
        }
    }
}

// 1.定義一個線程類繼承Thread類。
class MyThread extends Thread{
    // 2.重寫run()方法
    @Override
    public void run() {
        // 線程的執行方法。
        for(int i = 0 ; i < 100 ; i++ ){
            System.out.println("子線程輸出:"+i);
        }
    }
}

優點:編碼簡單,在run()方法內獲取當前線程直接使用this就可以了,無需使用Thread.currentThread()方法。 缺點:線程類已經繼承了Thread類無法繼承其他類了,功能不能通過繼承拓(單繼承的局限性)。另外任務與代碼沒有分離,當多個線程執行一樣的任務時需要多份任務代碼。

小結:

  • 線程類是繼承了Thread的類。

  • 啟動線程必須調用start()方法。

  • 多線程是并發搶占CPU執行,所以在執行的過程中會出現并發隨機性

方式二:實現Runnable接口的方式。

  • 1.創建一個線程任務類實現Runnable接口。

  • 2.重寫run()方法

  • 3.創建一個線程任務對象。

  • 4.把線程任務對象包裝成線程對象

  • 5.調用線程對象的start()方法啟動線程。

public class ThreadDemo {
    public static void main(String[] args) {
        // 3.創建一個線程任務對象(注意:線程任務對象不是線程對象,只是執行線程的任務的)
        Runnable target = new MyRunnable();
        // 4.把線程任務對象包裝成線程對象.且可以指定線程名稱
        // Thread t = new Thread(target);
        Thread t = new Thread(target,"1號線程");
        // 5.調用線程對象的start()方法啟動線程
        t.start();

        Thread t2 = new Thread(target);
        // 調用線程對象的start()方法啟動線程
        t2.start();

        for(int i = 0 ; i < 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+"==>"+i);
        }
    }
}

// 1.創建一個線程任務類實現Runnable接口。
class MyRunnable implements Runnable{
    // 2.重寫run()方法
    @Override
    public void run() {
        for(int i = 0 ; i < 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+"==>"+i);
        }
    }
}

優點:

線程任務類只是實現了Runnable接口,可以繼續繼承其他類,而且可以繼續實現其他接口(避免了單繼承的局限性)。 同一個線程任務對象可以被包裝成多個線程對象,適合多個多個線程去共享同一個資源。實現解耦操作,線程任務代碼可以被多個線程共享,線程任務代碼和線程獨立。

方法三:實現Callable接口

  • 1.定義一個線程任務類實現Callable接口 , 申明線程執行的結果類型。

  • 2.重寫線程任務類的call方法,這個方法可以直接返回執行的結果。

  • 3.創建一個Callable的線程任務對象。

  • 4.把Callable的線程任務對象包裝成一個FutureTask對象。

  • 5.把FutureTask對象包裝成線程對象。

  • 6.調用線程的start()方法啟動線程 。

public class ThreadDemo {
    public static void main(String[] args) {
        // 3.創建一個Callable的線程任務對象
        Callable call = new MyCallable();
        // 4.把Callable任務對象包裝成一個未來任務對象
        //      -- public FutureTask(Callable<V> callable)
        // 未來任務對象是啥,有啥用?
        //      -- 未來任務對象其實就是一個Runnable對象:這樣就可以被包裝成線程對象!
        //      -- 未來任務對象可以在線程執行完畢之后去得到線程執行的結果。
        FutureTask<String> task = new FutureTask<>(call);
        // 5.把未來任務對象包裝成線程對象
        Thread t = new Thread(task);
        // 6.啟動線程對象
        t.start();

        for(int i = 1 ; i <= 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+" => " + i);
        }

        // 在最后去獲取線程執行的結果,如果線程沒有結果,讓出CPU等線程執行完再來取結果
        try {
            String rs = task.get(); // 獲取call方法返回的結果(正常/異常結果)
            System.out.println(rs);
        }  catch (Exception e) {
            e.printStackTrace();
        }

    }
}

// 1.創建一個線程任務類實現Callable接口,申明線程返回的結果類型
class MyCallable implements Callable<String>{
    // 2.重寫線程任務類的call方法!
    @Override
    public String call() throws Exception {
        // 需求:計算1-10的和返回
        int sum = 0 ;
        for(int i = 1 ; i <= 10 ; i++ ){
            System.out.println(Thread.currentThread().getName()+" => " + i);
            sum+=i;
        }
        return Thread.currentThread().getName()+"執行的結果是:"+sum;
    }
}

優點: 線程任務類只是實現了Callable接口,可以繼續繼承其他類,而且可以繼續實現其他接口(避免了單繼承的局限性)。 同一個線程任務對象可以被包裝成多個線程對象,適合多個多個線程去共享同一個資源。實現解耦操作,線程任務代碼可以被多個線程共享,線程任務代碼和線程獨立。最關鍵的是能直接得到線程執行的結果。

到此,相信大家對“Java并發編程之線程怎么創建”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九龙县| 漯河市| 霞浦县| 富民县| 梅州市| 彰化县| 进贤县| 康马县| 满洲里市| 文山县| 新宁县| 合肥市| 名山县| 乌兰浩特市| 红原县| 文山县| 隆化县| 林口县| 新郑市| 淮滨县| 仁寿县| 称多县| 上饶县| 喜德县| 华池县| 平舆县| 雅安市| 寿光市| 渝中区| 武乡县| 绿春县| 佛学| 阳朔县| 资阳市| 出国| 哈密市| 江达县| 台东市| 周至县| 陕西省| 枝江市|