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

java通過Callable和Future來接收線程池的執(zhí)行結(jié)果

 更新時(shí)間:2019年08月16日 09:24:00   作者:逍遙侯爵  
這篇文章主要介紹了java通過Callable和Future來接收線程池的執(zhí)行結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在Java的線程執(zhí)行中,不管是直接繼承Thread的方式,還是實(shí)現(xiàn)Runnable接口的方式,都不會(huì)獲取到線程執(zhí)行的返回結(jié)果。這樣如果線程在執(zhí)行過程中出現(xiàn)了錯(cuò)誤,那么主線程也不會(huì)感知到。即使打印了日志,也不能立即拋出異常。事后查看日志才能發(fā)現(xiàn)出現(xiàn)了bug。而且到那時(shí)發(fā)生問題的代碼點(diǎn)距離真正的問題點(diǎn)可能會(huì)相差很遠(yuǎn)。如果在線程池執(zhí)行的過程中出現(xiàn)了bug能及時(shí)地拋出異常,那么這將會(huì)是一個(gè)很好的實(shí)現(xiàn)。解決上述問題的辦法是使用Callable接口,其可以獲取到線程的返回結(jié)果,通過Future的get方法來承接。以下通過一個(gè)1000個(gè)線程實(shí)現(xiàn)累加的例子,來演示Callable和Future的使用:

package com.hys.test;
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
 
import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
public class Test {
 
  private static AtomicInteger num = new AtomicInteger();
 
  public static void main(String[] args) throws InterruptedException, ExecutionException {
    CountDownLatch latch = new CountDownLatch(1000);
    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("increment-pool-%d").build();
    ExecutorService poolexecutor = new ThreadPoolExecutor(1000, 1000, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    Future<String> submit = null;
    for (int i = 0; i < 1000; i++) {
      if (submit != null && submit.get() != null) {
        latch.countDown();
        continue;
      }
      submit = poolexecutor.submit(() -> {
        try {
          //這里模擬一個(gè)耗時(shí)很長(zhǎng)的操作
          num.getAndIncrement();
          //int a = 1 / 0;
          Thread.sleep(1);
          return null;
        } catch (Exception e) {
          return e.toString();
        } finally {
          latch.countDown();
        }
      });
    }
    poolexecutor.shutdown();
    //主線程等待所有分線程執(zhí)行完畢后再執(zhí)行
    latch.await();
    String errorMsg = submit.get();
    //如果子線程在執(zhí)行過程中有錯(cuò)誤,則在此拋出該異常
    if (errorMsg != null) {
      throw new RuntimeException(errorMsg);
    }
    System.out.println(num);
  }
}

如果每個(gè)線程在執(zhí)行的過程中沒出現(xiàn)問題,則返回的結(jié)果為null。如果返回結(jié)果不為null,則代表該線程執(zhí)行的代碼有問題,此時(shí)將錯(cuò)誤信息返回。放開上述第33行代碼的注釋,以此來模擬一個(gè)算術(shù)異常,再次執(zhí)行上述代碼,可以得到如下的結(jié)果:

Exception in thread "main" java.lang.RuntimeException: java.lang.ArithmeticException: / by zero
 at com.hys.test.Test.main(Test.java:49)

由上可以看到,在主線程拋出了算術(shù)異常,可以被感知到。

但是需要注意的一點(diǎn)的是,如果線程的執(zhí)行結(jié)果互相依賴的話,也就是各線程都會(huì)調(diào)用Future的get方法的話,get方法不得不等待任務(wù)執(zhí)行完成,換言之,如果多個(gè)任務(wù)提交后,返回的多個(gè)Future逐一調(diào)用get方法時(shí),將會(huì)依次阻塞,任務(wù)的執(zhí)行從并行變?yōu)榇?。如果想解決該問題,可以考慮使用Java 8中的CompletableFuture來實(shí)現(xiàn)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis-Plus自動(dòng)化填充的踩坑記錄及解決

    MyBatis-Plus自動(dòng)化填充的踩坑記錄及解決

    這篇文章主要介紹了MyBatis-Plus自動(dòng)化填充的踩坑記錄及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot整合RabbitMQ 手動(dòng)應(yīng)答(簡(jiǎn)單demo)

    SpringBoot整合RabbitMQ 手動(dòng)應(yīng)答(簡(jiǎn)單demo)

    這篇文章主要介紹了SpringBoot整合RabbitMQ 手動(dòng)應(yīng)答 簡(jiǎn)單demo,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java的JsonObject對(duì)象提取值方法

    java的JsonObject對(duì)象提取值方法

    下面小編就為大家分享一篇java的JsonObject對(duì)象提取值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 簡(jiǎn)單了解Spring IoC相關(guān)概念原理

    簡(jiǎn)單了解Spring IoC相關(guān)概念原理

    這篇文章主要介紹了簡(jiǎn)單了解Spring IoC相關(guān)概念原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Springboot整合RabbitMQ消息中間件的使用

    Springboot整合RabbitMQ消息中間件的使用

    在沒有特別要求的情況下,通常會(huì)選擇RabbitMQ作為消息中間件,本文主要介紹了Springboot整合RabbitMQ消息中間件的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • springboot統(tǒng)一異常處理(返回json)并格式化異常

    springboot統(tǒng)一異常處理(返回json)并格式化異常

    這篇文章主要介紹了springboot統(tǒng)一異常處理(返回json)并格式化異常,對(duì)spring boot的默認(rèn)異常處理方式進(jìn)行修改,要統(tǒng)一返回?cái)?shù)據(jù)格式,優(yōu)雅的數(shù)據(jù)交互,優(yōu)雅的開發(fā)應(yīng)用,需要的朋友可以參考下
    2023-07-07
  • 淺談IDEA實(shí)用的Servlet模板

    淺談IDEA實(shí)用的Servlet模板

    今天給大家分享一下IDEA實(shí)用的Servlet模板,文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-05-05
  • 簡(jiǎn)單驗(yàn)證碼生成Java版

    簡(jiǎn)單驗(yàn)證碼生成Java版

    這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單驗(yàn)證碼生成Java版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法詳解

    Spring實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法詳解

    Spring提供了兩種方式實(shí)現(xiàn)定時(shí)任務(wù),一種是注解,還有一種就是接口了,這篇文章主要為大家介紹了這兩種方法的具體實(shí)現(xiàn)方法,需要的可以參考下
    2024-12-12
  • Java連接ftp服務(wù)器實(shí)例代碼

    Java連接ftp服務(wù)器實(shí)例代碼

    這篇文章主要介紹了Java連接ftp服務(wù)器實(shí)例代碼 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12

最新評(píng)論

邛崃市| 楚雄市| 木里| 新野县| 仁布县| 崇信县| 巴林左旗| 浠水县| 新巴尔虎右旗| 伽师县| 柘荣县| 福鼎市| 岫岩| 凤庆县| 长子县| 三门峡市| 余姚市| 株洲县| 师宗县| 本溪| 普安县| 延长县| 山东| 海原县| 玉田县| 靖江市| 吉安县| 明光市| 嵊泗县| 泾川县| 周口市| 鲁山县| 铁岭县| 保山市| 合川市| 永登县| 枝江市| 南昌市| 会泽县| 光泽县| 阿克苏市|