老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

java通過Callable和Future來接收線程池的執行結果

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

創新互聯建站為客戶提供專業的成都網站設計、做網站、程序、域名、空間一條龍服務,提供基于WEB的系統開發. 服務項目涵蓋了網頁設計、網站程序開發、WEB系統開發、微信二次開發、移動網站建設等網站方面業務。

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(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    Future submit = null;
    for (int i = 0; i < 1000; i++) {
      if (submit != null && submit.get() != null) {
        latch.countDown();
        continue;
      }
      submit = poolexecutor.submit(() -> {
        try {
          //這里模擬一個耗時很長的操作
          num.getAndIncrement();
          //int a = 1 / 0;
          Thread.sleep(1);
          return null;
        } catch (Exception e) {
          return e.toString();
        } finally {
          latch.countDown();
        }
      });
    }
    poolexecutor.shutdown();
    //主線程等待所有分線程執行完畢后再執行
    latch.await();
    String errorMsg = submit.get();
    //如果子線程在執行過程中有錯誤,則在此拋出該異常
    if (errorMsg != null) {
      throw new RuntimeException(errorMsg);
    }
    System.out.println(num);
  }
}

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

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

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

但是需要注意的一點的是,如果線程的執行結果互相依賴的話,也就是各線程都會調用Future的get方法的話,get方法不得不等待任務執行完成,換言之,如果多個任務提交后,返回的多個Future逐一調用get方法時,將會依次阻塞,任務的執行從并行變為串行。如果想解決該問題,可以考慮使用Java 8中的CompletableFuture來實現。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創新互聯。


分享文章:java通過Callable和Future來接收線程池的執行結果
鏈接URL:http://www.xueling.net.cn/article/iiigdg.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 日韩欧美永久中文字幕视频 | 福利影院在线看 | 老女人综合网 | 欧美在线一区二区三区四区 | 国产无遮挡裸体免费视频A片 | 欧美日韩国产的视频图片 | 成人毛片免费看 | 国产成人久久精品激情 | 亚洲国产一区二区精品视频 | 六月激情网 | 又爽又高潮的BB视频免费看 | 亚洲爆乳大丰满无码专区 | 极品少妇的粉嫩小泬视频 | 99久久久无码国产精品性 | 天海翼三点刺激高潮不停 | 人妻少妇乱子伦喷水 | 免费av大全 | 亚洲伊人久久大香线蕉 | 一级片国产 | 黄色看片网址 | 91人人视频在线观看 | 免费av网站在线看 | 青青草免费观看视频 | 很黄很爽的视频网站 | av一区在线观看 | 男女一区二区三区视频 | 亚洲成色WWW成人网站妖精 | 华人久久| 久色视频 | 亚洲AV日韩AV永久无码色欲 | 777米奇色888狠狠俺去啦 | 亚洲啊啊啊啊啊 | 国产亚洲一区二区手机在线观看 | 狠狠操视频网 | 成人午夜无码精品免费看 | 尹人香蕉久久99天天拍久女久 | 91av视频在线观看免费 | 无码AV人片在线观看天堂 | 久久久橹橹橹久久久久高清 | 久久亚洲激情 | 国产精品国产a |