中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java CountDownLatch完成異步回調實例詳解

發布時間:2020-09-29 12:01:43 來源:腳本之家 閱讀:261 作者:lqh 欄目:編程語言

Java CountDownLatch完成異步回調實例詳解

實例代碼:

public class AsyncDemo {

  private static void doSomeTask() {
    System.out.println("Hello World");
  }

  private static void onCompletion() {
    System.out.println("All tasks finished");
  }

  public static void main(String[] args) {
    ExecutorService executor = Executors.newCachedThreadPool();
    final CountDownLatch latch = new CountDownLatch(2);

    executor.execute(new Task(latch));
    executor.execute(new Task(latch));

    executor.execute(() -> {
      try {
        latch.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      onCompletion();
    });
    executor.shutdown();
  }

  private static class Task implements Runnable {

    /**
     * CountDownLatch 是JDK提供的一個簡單的線程監測工具
     * 基于簡單的計數,調用countDown()方法表明當前線程已經終止
     * 在監測線程中調用await()方法,該方法會一直掛起直到所有其它線程終止
     */
    private final CountDownLatch latch;

    public Task(CountDownLatch latch) {
      this.latch = latch;
    }

    @Override
    public void run() {
      try {
        doSomeTask();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        latch.countDown();
      }
    }
  }
}

這里有兩點需要補充:

1.如果你是用main方法啟動的線程,這種調用方法是沒有問題的,JDK會確保所有線程都終止以后main方法才退出。但是如果main方法不是異步任務的啟動者(如JUnit,Spring,Tomcat),一旦啟動之后laucher將會失去對線程的控制。如在JUnit中laucher提交完任務后就會被認為所有過程已完成,其它線程會被強行終止。

2.正因為如此,請根據環境使用正確的Executor。比如,在web環境中,應該選用tomcat(或Spring)管理的線程池作為Executor,這樣才能確保web應用對于異步任務的整個生命周期具有控制權;如果你選用JDK的線程池有什么后果呢?任務也許可以正常執行,當一旦你終止web-app,正在執行的異步線程并不會被正常kill掉,并由此造成內存泄漏或其它不可預見的后果。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

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

AI

科尔| 海宁市| 饶平县| 伊金霍洛旗| 昌都县| 兴宁市| 宝应县| 卓尼县| 平乐县| 彰武县| 饶阳县| 班戈县| 东港市| 宜昌市| 高尔夫| 江西省| 福泉市| 高雄县| 泰州市| 濮阳县| 鲁山县| 洪雅县| 五家渠市| 泉州市| 深圳市| 广州市| 彭州市| 罗定市| 揭西县| 伊川县| 福州市| 望江县| 南投市| 惠州市| 江都市| 大名县| 小金县| 盐城市| 于田县| 平顶山市| 疏勒县|