91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java實現Promise.all()的示例代碼

發布時間:2020-10-22 21:01:36 來源:腳本之家 閱讀:216 作者:SevenLin1993 欄目:編程語言

JavaScript的Promise.all()

Promise是JavaScript異步編程的一種解決方案,在ES6中引入。

通過Promise.all()可以實現對一組異步請求的統一處理,等待所有異步執行完成之后調用回調函數。

其實,這種并發執行同步等待的需求在Java并發編程中也很常見,那么,是否可以通過Java也來實現這樣一個Promise類呢?

使用Java實現Promise.all()

使用工具

CountDownLatch:Java并發工具包中有CountDownLatch類允許一個或多個線程等待其他線程的一系列操作完成。

ThreadPoolExecutor:通過線程池實現多線程的并發執行

實現

public class Promise {

  private static ExecutorService executorService = Executors.newScheduledThreadPool(16);

  private Promise() {
    throw new AssertionError();
  }

  /**
   * 實現并發同時地對某個action并發執行并返回執行結果
   * 實現思路:
   * 并發創建所有執行的線程,并通過鎖(start)阻塞等待著
   * 在創建所有執行的線程后(ready)開始計時,并解鎖然所有的線程啟動
   * 通過另外一個鎖(done)記錄執行完的線程
   * 主線程只需關心3點
   * - 所有線程是否準備好
   * - 準備好的話開始計時并解鎖開始執行
   * - 等待執行完畢
   *
   * @param callableList 要并發執行的列表
   * @return list 執行結果,list.item為null的話表示執行異常
   * @throws InterruptedException 異常
   */
  public static <T> List<T> all(final List<Callable<T>> callableList) throws InterruptedException {
    final List<T> result = new ArrayList<>();
    int length = callableList.size();
    final CountDownLatch ready = new CountDownLatch(length);
    final CountDownLatch start = new CountDownLatch(1);
    final CountDownLatch done = new CountDownLatch(length);
    for (final Callable<T> callable : callableList) {
      executorService.execute(new Runnable() {
        @Override
        public void run() {
          ready.countDown();
          try {
            start.await();
            T t = callable.call();
            result.add(t);
          } catch (Exception e) {
            // interrupt when exception
            Thread.currentThread().interrupt();
            // set null mean exception
            result.add(null);
            e.printStackTrace();
          } finally {
            done.countDown();
          }
        }
      });
    }
    ready.await();
    long startnano = System.nanoTime();
    start.countDown();
    done.await();
    long cause = System.nanoTime() - startnano;
    System.out.println(String.format("Promise all done,cause time millSecond: %s", cause / 1000000));
    return result;
  }
}

效果

測試

public void promiseAllTest() throws Exception{

  List<Callable<String>> callables = new ArrayList<>();

  for (int i = 0; i < 10; i++) {
    int finalI = i;
    callables.add(new Callable<String>() {
      @Override
      public String call() throws Exception {
        int millis = new Random().nextInt(10000);
        Thread.sleep(millis);
        System.out.println(String.format("thread%s sleep %s millis" ,finalI,millis));
        return "Thread" + finalI;
      }
    });
  }

  List<String> result = Promise.all(callables);

  System.out.println(result);
  System.out.println("done...");

}

測試結果

thread1 sleep 732 millis
thread2 sleep 758 millis
thread7 sleep 976 millis
thread8 sleep 1397 millis
thread5 sleep 1513 millis
thread0 sleep 2221 millis
thread3 sleep 4885 millis
thread6 sleep 5221 millis
thread4 sleep 7101 millis
thread9 sleep 7634 millis
Promise all done,cause time millSecond: 7638
[Thread1, Thread2, Thread7, Thread8, Thread5, Thread0, Thread3, Thread6, Thread4, Thread9]
done...

總結

本文只是通過原生Java實現簡單版本的Promise.all(),可用于簡單的并發編程,但是對于實際高并發應用還需要優化,如對線程池的優化,還有中斷的處理等。

參考

《Effective Java》第二版第十章第69條:并發工具優先于wait和notify

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深圳市| 古蔺县| 忻州市| 金华市| 陇川县| 保山市| 洛扎县| 九龙坡区| 大理市| 波密县| 镇巴县| 白玉县| 大方县| 鲁山县| 海城市| 文昌市| 富顺县| 丹寨县| 锦州市| 沅江市| 二手房| 孟州市| 富平县| 邯郸县| 达拉特旗| 兴山县| 四川省| 阿瓦提县| 涿州市| 芮城县| 侯马市| 陇南市| 崇州市| 秦皇岛市| 神木县| 新丰县| 苏尼特右旗| 蓝田县| 寻乌县| 桐庐县| 喀喇沁旗|