日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell 获取命令执行结果_java高并发系列 第31天:获取线程执行结果,这6种方法你都知道?...

發(fā)布時間:2023/12/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell 获取命令执行结果_java高并发系列 第31天:获取线程执行结果,这6种方法你都知道?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是java高并發(fā)系列第31篇。

環(huán)境:jdk1.8。

java高并發(fā)系列已經(jīng)學(xué)了不少東西了,本篇文章,我們用前面學(xué)的知識來實現(xiàn)一個需求:

在一個線程中需要獲取其他線程的執(zhí)行結(jié)果,能想到幾種方式?各有什么優(yōu)缺點(diǎn)?

結(jié)合這個需求,我們使用6種方式,來對之前學(xué)過的知識點(diǎn)做一個回顧,加深記憶。

方式1:Thread的join()方法實現(xiàn)

代碼:

package?com.itsoku.chat31;

import?java.sql.Time;
import?java.util.concurrent.*;

/**
?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
?*/
public?class?Demo1?{
????//用于封裝結(jié)果
????static?class?Result<T>?{
????????T?result;

????????public?T?getResult()?{
????????????return?result;
????????}

????????public?void?setResult(T?result)?{
????????????this.result?=?result;
????????}
????}

????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
????????System.out.println(System.currentTimeMillis());
????????//用于存放子線程執(zhí)行的結(jié)果
????????Result?result?=?new?Result<>();//創(chuàng)建一個子線程
????????Thread?thread?=?new?Thread(()?->?{try?{
????????????????TimeUnit.SECONDS.sleep(3);
????????????????result.setResult(10);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????});
????????thread.start();//讓主線程等待thread線程執(zhí)行完畢之后再繼續(xù),join方法會讓當(dāng)前線程阻塞
????????thread.join();//獲取thread線程的執(zhí)行結(jié)果
????????Integer?rs?=?result.getResult();
????????System.out.println(System.currentTimeMillis());
????????System.out.println(System.currentTimeMillis()?+?":"?+?rs);
????}
}

輸出:

1566733162636
1566733165692
1566733165692:10

代碼中通過join方式阻塞了當(dāng)前主線程,當(dāng)thread線程執(zhí)行完畢之后,join方法才會繼續(xù)執(zhí)行。

此行結(jié)論有誤,請?zhí)^:join的方式,只能阻塞一個線程,如果其他線程中也需要獲取thread線程的執(zhí)行結(jié)果,join方法無能為力了。

關(guān)于join()方法和線程更詳細(xì)的使用,可以參考:線程的基本操作

方式2:CountDownLatch實現(xiàn)

代碼:

package?com.itsoku.chat31;

import?java.util.concurrent.*;

/**
?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
?*/
public?class?Demo2?{
????//用于封裝結(jié)果
????static?class?Result<T>?{
????????T?result;

????????public?T?getResult()?{
????????????return?result;
????????}

????????public?void?setResult(T?result)?{
????????????this.result?=?result;
????????}
????}

????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
????????System.out.println(System.currentTimeMillis());
????????CountDownLatch?countDownLatch?=?new?CountDownLatch(1);
????????//用于存放子線程執(zhí)行的結(jié)果
????????Demo1.Result?result?=?new?Demo1.Result<>();//創(chuàng)建一個子線程
????????Thread?thread?=?new?Thread(()?->?{try?{
????????????????TimeUnit.SECONDS.sleep(3);
????????????????result.setResult(10);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}finally?{
????????????????countDownLatch.countDown();
????????????}
????????});
????????thread.start();//countDownLatch.await()會讓當(dāng)前線程阻塞,當(dāng)countDownLatch中的計數(shù)器變?yōu)?的時候,await方法會返回
????????countDownLatch.await();//獲取thread線程的執(zhí)行結(jié)果
????????Integer?rs?=?result.getResult();
????????System.out.println(System.currentTimeMillis());
????????System.out.println(System.currentTimeMillis()?+?":"?+?rs);
????}
}

輸出:

1566733720406
1566733723453
1566733723453:10

上面代碼也達(dá)到了預(yù)期效果,使用CountDownLatch可以讓一個或者多個線程等待一批線程完成之后,自己再繼續(xù);CountDownLatch更詳細(xì)的介紹見:JUC中等待多線程完成的工具類CountDownLatch,必備技能

方式3:ExecutorService.submit方法實現(xiàn)

代碼:

package?com.itsoku.chat31;

import?java.util.concurrent.*;

/**
?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
?*/
public?class?Demo3?{
????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
????????//創(chuàng)建一個線程池
????????ExecutorService?executorService?=?Executors.newCachedThreadPool();
????????System.out.println(System.currentTimeMillis());
????????Future?future?=?executorService.submit(()?->?{try?{
????????????????TimeUnit.SECONDS.sleep(3);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}return?10;
????????});//關(guān)閉線程池
????????executorService.shutdown();
????????System.out.println(System.currentTimeMillis());
????????Integer?result?=?future.get();
????????System.out.println(System.currentTimeMillis()?+?":"?+?result);
????}
}

輸出:

1566734119938
1566734119989
1566734122989:10

使用ExecutorService.submit方法實現(xiàn)的,此方法返回一個Future,future.get()會讓當(dāng)前線程阻塞,直到Future關(guān)聯(lián)的任務(wù)執(zhí)行完畢。

相關(guān)知識:

  • JAVA線程池,這一篇就夠了

  • JUC中的Executor框架詳解1

  • JUC中的Executor框架詳解2

  • 方式4:FutureTask方式1

    代碼:

    package?com.itsoku.chat31;

    import?java.util.concurrent.*;

    /**
    ?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
    ?*/
    public?class?Demo4?{
    ????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
    ????????System.out.println(System.currentTimeMillis());
    ????????//創(chuàng)建一個FutureTask
    ????????FutureTask?futureTask?=?new?FutureTask<>(()?->?{try?{
    ????????????????TimeUnit.SECONDS.sleep(3);
    ????????????}?catch?(InterruptedException?e)?{
    ????????????????e.printStackTrace();
    ????????????}return?10;
    ????????});//將futureTask傳遞一個線程運(yùn)行new?Thread(futureTask).start();
    ????????System.out.println(System.currentTimeMillis());//futureTask.get()會阻塞當(dāng)前線程,直到futureTask執(zhí)行完畢
    ????????Integer?result?=?futureTask.get();
    ????????System.out.println(System.currentTimeMillis()?+?":"?+?result);
    ????}
    }

    輸出:

    1566736350314
    1566736350358
    1566736353360:10

    代碼中使用FutureTask實現(xiàn)的,FutureTask實現(xiàn)了Runnable接口,并且內(nèi)部帶返回值,所以可以傳遞給Thread直接運(yùn)行,futureTask.get()會阻塞當(dāng)前線程,直到FutureTask構(gòu)造方法傳遞的任務(wù)執(zhí)行完畢,get方法才會返回。關(guān)于FutureTask詳細(xì)使用,請參考:JUC中的Executor框架詳解1

    方式5:FutureTask方式2

    代碼:

    package?com.itsoku.chat31;

    import?java.util.concurrent.ExecutionException;
    import?java.util.concurrent.FutureTask;
    import?java.util.concurrent.TimeUnit;

    /**
    ?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
    ?*/
    public?class?Demo5?{
    ????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
    ????????System.out.println(System.currentTimeMillis());
    ????????//創(chuàng)建一個FutureTask
    ????????FutureTask?futureTask?=?new?FutureTask<>(()?->?10);//將futureTask傳遞一個線程運(yùn)行new?Thread(()?->?{try?{
    ????????????????TimeUnit.SECONDS.sleep(3);
    ????????????}?catch?(InterruptedException?e)?{
    ????????????????e.printStackTrace();
    ????????????}
    ????????????futureTask.run();
    ????????}).start();
    ????????System.out.println(System.currentTimeMillis());//futureTask.get()會阻塞當(dāng)前線程,直到futureTask執(zhí)行完畢
    ????????Integer?result?=?futureTask.get();
    ????????System.out.println(System.currentTimeMillis()?+?":"?+?result);
    ????}
    }

    輸出:

    1566736319925
    1566736319970
    1566736322972:10

    創(chuàng)建了一個FutureTask對象,調(diào)用futureTask.get()會阻塞當(dāng)前線程,子線程中休眠了3秒,然后調(diào)用futureTask.run();當(dāng)futureTask的run()方法執(zhí)行完畢之后,futureTask.get()會從阻塞中返回。

    注意:這種方式和方式4的不同點(diǎn)。

    關(guān)于FutureTask詳細(xì)使用,請參考:JUC中的Executor框架詳解1

    方式6:CompletableFuture方式實現(xiàn)

    代碼:

    package?com.itsoku.chat31;

    import?java.util.concurrent.CompletableFuture;
    import?java.util.concurrent.ExecutionException;
    import?java.util.concurrent.FutureTask;
    import?java.util.concurrent.TimeUnit;

    /**
    ?*?跟著阿里p7學(xué)并發(fā),微信公眾號:javacode2018
    ?*/
    public?class?Demo6?{
    ????public?static?void?main(String[]?args)?throws?ExecutionException,?InterruptedException?{
    ????????System.out.println(System.currentTimeMillis());
    ????????CompletableFuture?completableFuture?=?CompletableFuture.supplyAsync(()?->?{try?{
    ????????????????TimeUnit.SECONDS.sleep(3);
    ????????????}?catch?(InterruptedException?e)?{
    ????????????????e.printStackTrace();
    ????????????}return?10;
    ????????});
    ????????System.out.println(System.currentTimeMillis());//futureTask.get()會阻塞當(dāng)前線程,直到futureTask執(zhí)行完畢
    ????????Integer?result?=?completableFuture.get();
    ????????System.out.println(System.currentTimeMillis()?+?":"?+?result);
    ????}
    }

    輸出:

    1566736205348
    1566736205428
    1566736208429:10

    CompletableFuture.supplyAsync可以用來異步執(zhí)行一個帶返回值的任務(wù),調(diào)用completableFuture.get()

    會阻塞當(dāng)前線程,直到任務(wù)執(zhí)行完畢,get方法才會返回。

    關(guān)于CompletableFuture更詳細(xì)的使用見:JUC中工具類CompletableFuture,必備技能

    java高并發(fā)系列目錄

  • 第1天:必須知道的幾個概念

  • 第2天:并發(fā)級別

  • 第3天:有關(guān)并行的兩個重要定律

  • 第4天:JMM相關(guān)的一些概念

  • 第5天:深入理解進(jìn)程和線程

  • 第6天:線程的基本操作

  • 第7天:volatile與Java內(nèi)存模型

  • 第8天:線程組

  • 第9天:用戶線程和守護(hù)線程

  • 第10天:線程安全和synchronized關(guān)鍵字

  • 第11天:線程中斷的幾種方式

  • 第12天JUC:ReentrantLock重入鎖

  • 第13天:JUC中的Condition對象

  • 第14天:JUC中的LockSupport工具類,必備技能

  • 第15天:JUC中的Semaphore(信號量)

  • 第16天:JUC中等待多線程完成的工具類CountDownLatch,必備技能

  • 第17天:JUC中的循環(huán)柵欄CyclicBarrier的6種使用場景

  • 第18天:JAVA線程池,這一篇就夠了

  • 第19天:JUC中的Executor框架詳解1

  • 第20天:JUC中的Executor框架詳解2

  • 第21天:java中的CAS,你需要知道的東西

  • 第22天:JUC底層工具類Unsafe,高手必須要了解

  • 第23天:JUC中原子類,一篇就夠了

  • 第24天:ThreadLocal、InheritableThreadLocal(通俗易懂)

  • 第25天:掌握J(rèn)UC中的阻塞隊列

  • 第26篇:學(xué)會使用JUC中常見的集合,常看看!

  • 第27天:實戰(zhàn)篇,接口性能提升幾倍原來這么簡單

  • 第28天:實戰(zhàn)篇,微服務(wù)日志的傷痛,一并幫你解決掉

  • 第29天:高并發(fā)中常見的限流方式

  • 第30天:JUC中工具類CompletableFuture,必備技能

  • 阿里p7一起學(xué)并發(fā),公眾號:路人甲java,每天獲取最新文章!

    總結(jié)

    以上是生活随笔為你收集整理的shell 获取命令执行结果_java高并发系列 第31天:获取线程执行结果,这6种方法你都知道?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。