最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.線程與進(jìn)程

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

進(jìn)程的三個(gè)特征:

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

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

我們?cè)谶M(jìn)程中創(chuàng)建線程的方式有三種:

  • 方式一:繼承Thread類的方式
  • 1.定義一個(gè)線程類繼承Thread類。
  • 2.重寫run()方法
  • 3.創(chuàng)建一個(gè)新的線程對(duì)象。
  • 4.調(diào)用線程對(duì)象的start()方法啟動(dòng)線程。
public class ThreadDemo {
    // 啟動(dòng)后的ThreadDemo當(dāng)成一個(gè)進(jìn)程。
    // main方法是由主線程執(zhí)行的,理解成main方法就是一個(gè)主線程
    public static void main(String[] args) {
        // 3.創(chuàng)建一個(gè)線程對(duì)象
        Thread t = new MyThread();
        // 4.調(diào)用線程對(duì)象的start()方法啟動(dòng)線程,最終還是執(zhí)行run()方法!
        t.start();

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

// 1.定義一個(gè)線程類繼承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)點(diǎn):編碼簡(jiǎn)單,在run()方法內(nèi)獲取當(dāng)前線程直接使用this就可以了,無需使用Thread.currentThread()方法。 缺點(diǎn):線程類已經(jīng)繼承了Thread類無法繼承其他類了,功能不能通過繼承拓(單繼承的局限性)。另外任務(wù)與代碼沒有分離,當(dāng)多個(gè)線程執(zhí)行一樣的任務(wù)時(shí)需要多份任務(wù)代碼。

小結(jié):

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

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

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

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

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

// 1.創(chuàng)建一個(gè)線程任務(wù)類實(shí)現(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)點(diǎn):

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

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

  • 1.定義一個(gè)線程任務(wù)類實(shí)現(xiàn)Callable接口 , 申明線程執(zhí)行的結(jié)果類型。
  • 2.重寫線程任務(wù)類的call方法,這個(gè)方法可以直接返回執(zhí)行的結(jié)果。
  • 3.創(chuàng)建一個(gè)Callable的線程任務(wù)對(duì)象。
  • 4.把Callable的線程任務(wù)對(duì)象包裝成一個(gè)FutureTask對(duì)象。
  • 5.把FutureTask對(duì)象包裝成線程對(duì)象。
  • 6.調(diào)用線程的start()方法啟動(dòng)線程 。
public class ThreadDemo {
    public static void main(String[] args) {
        // 3.創(chuàng)建一個(gè)Callable的線程任務(wù)對(duì)象
        Callable call = new MyCallable();
        // 4.把Callable任務(wù)對(duì)象包裝成一個(gè)未來任務(wù)對(duì)象
        //      -- public FutureTask(Callable<V> callable)
        // 未來任務(wù)對(duì)象是啥,有啥用?
        //      -- 未來任務(wù)對(duì)象其實(shí)就是一個(gè)Runnable對(duì)象:這樣就可以被包裝成線程對(duì)象!
        //      -- 未來任務(wù)對(duì)象可以在線程執(zhí)行完畢之后去得到線程執(zhí)行的結(jié)果。
        FutureTask<String> task = new FutureTask<>(call);
        // 5.把未來任務(wù)對(duì)象包裝成線程對(duì)象
        Thread t = new Thread(task);
        // 6.啟動(dòng)線程對(duì)象
        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)建一個(gè)線程任務(wù)類實(shí)現(xiàn)Callable接口,申明線程返回的結(jié)果類型
class MyCallable implements Callable<String>{
    // 2.重寫線程任務(wù)類的call方法!
    @Override
    public String call() throws Exception {
        // 需求:計(jì)算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)點(diǎn): 線程任務(wù)類只是實(shí)現(xiàn)了Callable接口,可以繼續(xù)繼承其他類,而且可以繼續(xù)實(shí)現(xiàn)其他接口(避免了單繼承的局限性)。 同一個(gè)線程任務(wù)對(duì)象可以被包裝成多個(gè)線程對(duì)象,適合多個(gè)多個(gè)線程去共享同一個(gè)資源。實(shí)現(xiàn)解耦操作,線程任務(wù)代碼可以被多個(gè)線程共享,線程任務(wù)代碼和線程獨(dú)立。最關(guān)鍵的是能直接得到線程執(zhí)行的結(jié)果。

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

相關(guān)文章

  • SpringMVC @ControllerAdvice使用場(chǎng)景

    SpringMVC @ControllerAdvice使用場(chǎng)景

    這篇文章主要介紹了SpringMVC @ControllerAdvice使用場(chǎng)景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • resty client使用Java客戶端來訪問Api

    resty client使用Java客戶端來訪問Api

    這篇文章主要介紹了resty-client使用Java客戶端來訪問Api的驗(yàn)證權(quán)限,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 基于BIO的Java Socket通信詳解

    基于BIO的Java Socket通信詳解

    這篇文章主要為大家詳細(xì)介紹了基于BIO的Java Socket通信相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • java正則表達(dá)式的應(yīng)用 java讀取文件并獲取電話號(hào)碼

    java正則表達(dá)式的應(yīng)用 java讀取文件并獲取電話號(hào)碼

    這篇文章主要介紹了java正則表達(dá)式的應(yīng)用,應(yīng)用的內(nèi)容是java讀取文件并獲取電話號(hào)碼,感興趣的小伙伴們可以參考一下
    2015-11-11
  • Spring中配置數(shù)據(jù)源的幾種方式

    Spring中配置數(shù)據(jù)源的幾種方式

    今天小編就為大家分享一篇關(guān)于Spring中配置數(shù)據(jù)源的幾種方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java開發(fā)之內(nèi)部類的用法

    java開發(fā)之內(nèi)部類的用法

    本篇文章介紹了,java開發(fā)之內(nèi)部類的用法。需要的朋友參考下
    2013-05-05
  • 詳解IDEA的快捷鍵及智能提示

    詳解IDEA的快捷鍵及智能提示

    這篇文章主要介紹了詳解IDEA的快捷鍵及智能提示,文中有非常詳細(xì)的快捷鍵及智能提示的說明,對(duì)正在使用IDEA的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Spring boot+beetl+i18n國(guó)際化處理的方法

    Spring boot+beetl+i18n國(guó)際化處理的方法

    這篇文章主要介紹了Spring boot+beetl+i18n國(guó)際化處理的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java用鄰接表存儲(chǔ)圖的示例代碼

    Java用鄰接表存儲(chǔ)圖的示例代碼

    鄰接表是圖的一種鏈?zhǔn)酱鎯?chǔ)方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點(diǎn)和鄰接點(diǎn)。本文將用鄰接表實(shí)現(xiàn)存儲(chǔ)圖,感興趣的小伙伴可以了解一下
    2022-06-06
  • Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼

    Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組實(shí)例代碼

    這篇文章主要介紹了Java編程一維數(shù)組轉(zhuǎn)換成二維數(shù)組,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

专栏| 稷山县| 肥乡县| 绥芬河市| 宝清县| 太和县| 临泉县| 依安县| 景宁| 荥经县| 东光县| 鹰潭市| 蒲城县| 化州市| 景洪市| 顺平县| 县级市| 镇康县| 旬阳县| 镇安县| 祥云县| 嘉兴市| 张家口市| 准格尔旗| 资阳市| 鞍山市| 合作市| 大理市| 根河市| 改则县| 灵武市| 沙河市| 北流市| 安平县| 贞丰县| 延吉市| 宜宾县| 哈巴河县| 邵东县| 霍州市| 收藏|