欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java并發(fā)編程之線程創(chuàng)建介紹

 更新時間:2022年04月18日 12:17:00   作者:派大大大星  
這篇文章主要介紹了Java并發(fā)編程之線程創(chuàng)建,進程是代碼在數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,線程則是一個實體,一個進程中至少有一個線程,下文更多相關內(nèi)容需要的小伙伴可以參考一下

1.線程與進程

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

進程的三個特征:

  • 動態(tài)性 : 進程是運行中的程序,要動態(tài)的占用內(nèi)存,CPU和網(wǎng)絡等資源。
  • 獨立性 : 進程與進程之間是相互獨立的,彼此有自己的獨立內(nèi)存區(qū)域。
  • 并發(fā)性 : 假如CPU是單核,同一個時刻其實內(nèi)存中只有一個進程在被執(zhí)行。CPU會分時輪詢切換依次為每個進程服務,因為切換的速度非常快,給我們的感覺這些進程在同時執(zhí)行,這就是并發(fā)性。

2.線程的創(chuàng)建與運行

我們在進程中創(chuàng)建線程的方式有三種:

  • 方式一:繼承Thread類的方式
  • 1.定義一個線程類繼承Thread類。
  • 2.重寫run()方法
  • 3.創(chuàng)建一個新的線程對象。
  • 4.調(diào)用線程對象的start()方法啟動線程。
public class ThreadDemo {
    // 啟動后的ThreadDemo當成一個進程。
    // main方法是由主線程執(zhí)行的,理解成main方法就是一個主線程
    public static void main(String[] args) {
        // 3.創(chuàng)建一個線程對象
        Thread t = new MyThread();
        // 4.調(diào)用線程對象的start()方法啟動線程,最終還是執(zhí)行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() {
        // 線程的執(zhí)行方法。
        for(int i = 0 ; i < 100 ; i++ ){
            System.out.println("子線程輸出:"+i);
        }
    }
}

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

小結(jié):

  • 線程類是繼承了Thread的類。
  • 啟動線程必須調(diào)用start()方法。
  • 多線程是并發(fā)搶占CPU執(zhí)行,所以在執(zhí)行的過程中會出現(xiàn)并發(fā)隨機性

方式二:實現(xiàn)Runnable接口的方式。

  • 1.創(chuàng)建一個線程任務類實現(xiàn)Runnable接口。
  • 2.重寫run()方法
  • 3.創(chuàng)建一個線程任務對象。
  • 4.把線程任務對象包裝成線程對象
  • 5.調(diào)用線程對象的start()方法啟動線程。
public class ThreadDemo {
    public static void main(String[] args) {
        // 3.創(chuàng)建一個線程任務對象(注意:線程任務對象不是線程對象,只是執(zhí)行線程的任務的)
        Runnable target = new MyRunnable();
        // 4.把線程任務對象包裝成線程對象.且可以指定線程名稱
        // Thread t = new Thread(target);
        Thread t = new Thread(target,"1號線程");
        // 5.調(diào)用線程對象的start()方法啟動線程
        t.start();

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

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

// 1.創(chuàng)建一個線程任務類實現(xiàn)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);
        }
    }
}

優(yōu)點:

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

方法三:實現(xiàn)Callable接口

  • 1.定義一個線程任務類實現(xiàn)Callable接口 , 申明線程執(zhí)行的結(jié)果類型。
  • 2.重寫線程任務類的call方法,這個方法可以直接返回執(zhí)行的結(jié)果。
  • 3.創(chuàng)建一個Callable的線程任務對象。
  • 4.把Callable的線程任務對象包裝成一個FutureTask對象。
  • 5.把FutureTask對象包裝成線程對象。
  • 6.調(diào)用線程的start()方法啟動線程 。
public class ThreadDemo {
    public static void main(String[] args) {
        // 3.創(chuàng)建一個Callable的線程任務對象
        Callable call = new MyCallable();
        // 4.把Callable任務對象包裝成一個未來任務對象
        //      -- public FutureTask(Callable<V> callable)
        // 未來任務對象是啥,有啥用?
        //      -- 未來任務對象其實就是一個Runnable對象:這樣就可以被包裝成線程對象!
        //      -- 未來任務對象可以在線程執(zhí)行完畢之后去得到線程執(zhí)行的結(jié)果。
        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);
        }

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

    }
}

// 1.創(chuàng)建一個線程任務類實現(xiàn)Callable接口,申明線程返回的結(jié)果類型
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()+"執(zhí)行的結(jié)果是:"+sum;
    }
}

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

到此這篇關于Java并發(fā)編程之線程創(chuàng)建的文章就介紹到這了,更多相關Java 線程創(chuàng)建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)簡易學籍管理系統(tǒng)

    Java實現(xiàn)簡易學籍管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡易學籍管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java自定義JDBC實現(xiàn)連接池

    java自定義JDBC實現(xiàn)連接池

    本文主要介紹了java自定義JDBC實現(xiàn)連接池,包含實現(xiàn)JDBC連接池以及SQLException?異常的處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • springboot如何靜態(tài)加載@configurationProperties

    springboot如何靜態(tài)加載@configurationProperties

    這篇文章主要介紹了springboot如何靜態(tài)加載@configurationProperties,本文一個錯誤案例和成功案例結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • java?random隨機數(shù)的用法及常見應用場景

    java?random隨機數(shù)的用法及常見應用場景

    這篇文章主要給大家介紹了關于java?random隨機數(shù)的用法及常見應用場景的相關資料,Java中的Random類是用來生成偽隨機數(shù)的工具類,它可以用來生成隨機的整數(shù)、浮點數(shù)和布爾值,需要的朋友可以參考下
    2023-11-11
  • java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法

    java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法

    這篇文章主要介紹了java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法,涉及Java數(shù)據(jù)庫操作中存儲過程的相關使用技巧,需要的朋友可以參考下
    2015-10-10
  • Java設計模式之享元模式

    Java設計模式之享元模式

    這篇文章主要為大家詳細介紹了Java設計模式之享元模式的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java控制臺輸出數(shù)字金字塔示例分享

    java控制臺輸出數(shù)字金字塔示例分享

    這篇文章主要介紹了java控制臺輸出數(shù)字金字塔的示例,控制臺輸出的缺陷是數(shù)字不能完全居中,只能右對齊或左對齊,大家參考使用吧
    2014-01-01
  • Netty?拆包沾包問題解決方案詳解

    Netty?拆包沾包問題解決方案詳解

    這篇文章主要為大家介紹了Netty?拆包沾包問題解決方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java通過反射訪問注解信息的方法示例

    Java通過反射訪問注解信息的方法示例

    這篇文章主要介紹了Java通過反射訪問注解信息的方法,結(jié)合實例形式分析了java基于反射訪問類成員方法注解信息的相關操作技巧,需要的朋友可以參考下
    2019-08-08
  • grails不能運行fork模式解決方法

    grails不能運行fork模式解決方法

    這篇文章主要介紹了如何解決grails2.3.2中不能運行fork模式的異常,大家參考使用吧
    2013-11-11

最新評論