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

溫馨提示×

溫馨提示×

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

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

Java并發工具輔助類的用法

發布時間:2020-08-03 11:34:02 來源:億速云 閱讀:132 作者:小豬 欄目:編程語言

這篇文章主要講解了Java并發工具輔助類的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

java中的并發工具類

一:等待多線程完成的CountDownLatch

CountDownLatch允許一個或多個線程等待其他線程完成操作。

package com.fuzhulei;
import java.util.concurrent.*;
​
/**
 * 減法計數器,主要是countDown(計數器1) 和 await(阻塞)方法,只有當計數器減為0的時候,當前線程才可以往下繼續執行。
 * 主要用于允許一個或多個線程等待其他線程完成操作
 * @author Huxudong
 * @createTime 2020-04-05 00:04:36
 **/
public class CountDownDemo {
  public static void main(String[] args) throws InterruptedException {
    /** 使用其構造函數,創建一個數值為6的計數器 */
    CountDownLatch countDownLatch = new CountDownLatch(6);
    /** 自定義線程池使用 */
    ExecutorService pool = new ThreadPoolExecutor(
        6,  // 核心線程池大小
        9, // 最大線程池的大小(根據是IO密集型,還是CPU密集型來確定大小)
        3L,  // 超時等待時間
        TimeUnit.SECONDS,  // 時間的單位
        new LinkedBlockingQueue<>(5), // 阻塞隊列是哪一種
        Executors.defaultThreadFactory(),   // 默認線程創建工廠
        new ThreadPoolExecutor.AbortPolicy()  // 四大拒絕策略,選擇一種
    );
    try{
      for (int i = 0; i < 6; i++) {
        /** 這個線程的提交,沒有返回值的任務 */
        pool.execute(()->{
          countDownLatch.countDown();
          System.out.println(Thread.currentThread().getName()+"執行一次減法");
        });
&#8203;
      }
    } catch(Exception e) {
      e.printStackTrace();
    } finally {
      /** 關閉線程池 */
      pool.shutdown();
    }
&#8203;
    countDownLatch.await();
    System.out.println("執行完成了");
&#8203;
  }
}

正確執行結果:

Java并發工具輔助類的用法

但是如果我們設置計數器的容量大于6的話(相對于我的程序而言),就會被阻塞在那里

Java并發工具輔助類的用法

會發現執行完成了 沒有被打印出來,而且程序一直沒有停止,這個時候就是因為計數器沒有歸0,所以當前線程被阻塞,不能向下面繼續進行。

二:同步屏障CyclicBarrier

CyclicBarrier的翻譯大致就是可循環的屏障。它主要的作用就是讓一組線程到達一個屏障(也可以叫做同步點)時被阻塞,直到最后一份線程到達屏障時,屏障才會開門,所有被屏障攔截的線程才會繼續運行。

package com.fuzhulei;
&#8203;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
&#8203;
/**
 * CyclicBarrier是一個加法計數器,即同步屏障,可循環的屏障,讓一組線程到達一個屏障(也可以叫做同步點)時被阻塞,直到最后一個線程到達屏障,達到了一開始初始化的屏障的數值,
 * 屏障才可以打開門,所有被攔截的線程才可以繼續工作,主要是通過調用await方法來實現的
 * @author Huxudong
 * @createTime 2020-04-04 22:53:50
 **/
public class CyclicBarrierDemo {
  public static void main(String[] args) {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
    new Thread(()->{
&#8203;
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程A已經到達屏障");
    },"A").start();
&#8203;
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程B已經到達屏障");
    },"B").start();
&#8203;
    new Thread(()->{
      try {
        cyclicBarrier.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (BrokenBarrierException e) {
        e.printStackTrace();
      }
      System.out.println("線程C已經到達屏障");
    },"C").start();
&#8203;
&#8203;
  }
}

執行的結果如下:

Java并發工具輔助類的用法

但是如果把定義的容量大于3(相對于我的程序而言),就會發現什么都不會輸出了,看截圖

Java并發工具輔助類的用法

并且程序一直還沒有停止,這就是屏障起到了作用,因為屏障要求至少需要4個(假設),但是此時只有三個線程到達,所以不滿足,屏障就一直阻攔不放路,那么所有的線程也就被阻塞不能向下面繼續運行,除非知道第四個過來,滿足條件才會運行。

三:控制并發線程數的Semaphore

用來控制同時訪問特定資源的線程數量,通過協調各個線程,以保證合理的使用公用的資源。

package com.fuzhulei;
&#8203;
import java.util.concurrent.*;
&#8203;
/**
 * 用來控制同時訪問特定資源的線程數量,通過協調各個線程,以保證合理的使用公用的資源
 * @author Huxudong
 * @createTime 2020-04-04 23:45:29
 **/
public class SemaphoreDemo {
  public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(5);
    ExecutorService pool = new ThreadPoolExecutor(
        10,
        20,
        3L,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>(20),
        Executors.defaultThreadFactory(),
        new ThreadPoolExecutor.AbortPolicy());
&#8203;
    try{
      for (int i = 0; i < 60; i++) {
        pool.execute(() ->{
          try {
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"限流成功");
            semaphore.release();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        });
      }
    } catch(Exception e) {
      e.printStackTrace();
    } finally {
      pool.shutdown();
    }
  }
}

執行的結果如下:

Java并發工具輔助類的用法

例如:數據庫資源,假如需要讀取幾十萬個數據的文件,因為都是IO密集型任務,所以開了2倍的處理器+1個線程數(IO密集型,所以線程可以多一些,讓cpu忙起來,因為IO操作的時候,很少操作Cpu)

但是如果讀到內存后,還需要存儲到數據庫中,但是數據庫連接我們設置的加入就10個,所以我們必須控制只有10個線程可以同時訪問數據庫連接保存數據,否則會報錯無法連接數據庫異常。

看完上述內容,是不是對Java并發工具輔助類的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

翁牛特旗| 辽阳县| 化州市| 阿克陶县| 阿城市| 萨嘎县| 澄迈县| 宁城县| 治多县| 玉树县| 宝山区| 农安县| 海城市| 文昌市| 阿坝县| 彭泽县| 巢湖市| 宾川县| 花垣县| 漠河县| 全州县| 万源市| 台南县| 永登县| 家居| 玉龙| 江达县| 琼海市| 辽源市| 乌兰察布市| 兴隆县| 巴彦淖尔市| 长子县| 永顺县| 东丽区| 固原市| 许昌市| 高雄市| 石台县| 宝坻区| 惠安县|