日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin

發布時間:2024/10/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. J.U.C - AQS (AbstractQueuedSynchronizer)

java.util.concurrent(J.U.C) 大大提高了并發性能,AQS 被認為是 J.U.C 的核心。

1.1?CountdownLatch

用來控制一個線程等待多個線程。

維護了一個計數器 cnt,每次調用 countDown() 方法會讓計數器的值減 1,減到 0的時候,那些因為調用 await() 方法而在等待的線程就會被喚醒

public class CountdownLatchExample {public static void main(String[] args) throws InterruptedException {final int totalThread = 10;CountDownLatch countDownLatch = new CountDownLatch(totalThread);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalThread; i++) {executorService.execute(() -> {System.out.print("run..");countDownLatch.countDown();});} countDownLatch.await();System.out.println("end");executorService.shutdown();} }

運行結果:

1.2 CyclicBarrier

用來控制多個線程互相等待,只有當多個線程都到達時,這些線程才會繼續執行

和 CountdownLatch 相似,都是通過維護計數器來實現的。

  • 線程執行 await() 方法之后計數器會減 1,并進行等待,直到計數器為 0,所有調用 awati() 方法而在等待的線程才能繼續執行。

CyclicBarrier 和 CountdownLatch 的一個區別是:

  • CyclicBarrier 的計數器通過調用reset() 方法可以循環使用,所以它才叫做循環屏障

CyclicBarrier 有兩個構造函數,其中 parties 指示計數器的初始值,barrierAction在所有線程都到達屏障的時候會執行一次。

public CyclicBarrier(int parties, Runnable barrierAction) {if (parties <= 0)throw new IllegalArgumentException();this.parties = parties;this.count = parties;this.barrierCommand = barrierAction; } public CyclicBarrier(int parties) {this(parties, null); } public class CyclicBarrierExample {public static void main(String[] args) {final int totalThread = 10;CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalThread; i++) {executorService.execute(() -> {System.out.print("before..");try {cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();} System.out.print("after..");});} executorService.shutdown();} }

運行結果:

1.3?Semaphore

Semaphore 就是操作系統中的信號量,可以控制對互斥資源的訪問線程數

以下代碼模擬了對某個服務的并發請求,每次只能有 3 個客戶端同時訪問,請求總數為 10。

public class SemaphoreExample {public static void main(String[] args) {final int clientCount = 3;final int totalRequestCount = 10;Semaphore semaphore = new Semaphore(clientCount);ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < totalRequestCount; i++) {executorService.execute(()->{try {semaphore.acquire();System.out.print(semaphore.availablePermits() + " ");} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}});} executorService.shutdown();} }

運行結果:

2. J.U.C - 其它組件

2.1?FutureTask

在介紹 Callable 時我們知道它可以有返回值,返回值通過 Future 進行封裝。

FutureTask 實現了 RunnableFuture 接口,該接口繼承自 Runnable 和 Future 接口,這使得 FutureTask 既可以當做一個任務執行,也可以有返回值。

public class FutureTask<V> implements RunnableFuture<V>public interface RunnableFuture<V> extends Runnable, Future<V>

FutureTask 可用于異步獲取執行結果或取消執行任務的場景。

當一個計算任務需要執行很長時間,那么就可以用 FutureTask 來封裝這個任務,主線程在完成自己的任務之后再去獲取結果。

public class FutureTaskExample {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int result = 0;for (int i = 0; i < 100; i++) {Thread.sleep(10);result += i;} return result;}});Thread computeThread = new Thread(futureTask);computeThread.start();Thread otherThread = new Thread(() -> {System.out.println("other task is running...");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});otherThread.start();System.out.println(futureTask.get());} }

運行結果:

2.2?BlockingQueue

java.util.concurrent.BlockingQueue 接口有以下阻塞隊列的實現:

  • FIFO 隊列 :LinkedBlockingQueue、ArrayBlockingQueue(固定長度)
  • 優先級隊列 :PriorityBlockingQueue提供了阻塞的 take() 和 put() 方法:
    • 如果隊列為空 take() 將阻塞,直到隊列中有內容;
    • 如果隊列為滿 put() 將阻塞,直到隊列有空閑位置。

使用 BlockingQueue 實現生產者消費者問題:

public class ProducerConsumer {private static BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);private static class Producer extends Thread {@Overridepublic void run() {try {queue.put("product");} catch (InterruptedException e) {e.printStackTrace();} System.out.print("produce..");}}private static class Consumer extends Thread {@Overridepublic void run() {try {String product = queue.take();} catch (InterruptedException e) {e.printStackTrace();} System.out.print("consume..");}} }public static void main(String[] args) {for (int i = 0; i < 2; i++) {Producer producer = new Producer();producer.start();} for (int i = 0; i < 5; i++) {Consumer consumer = new Consumer();consumer.start();} for (int i = 0; i < 3; i++) {Producer producer = new Producer();producer.start();} }

運行結果:

2.3?ForkJoin

主要用于并行計算中,和 MapReduce 原理類似,都是把大的計算任務拆分成多個小任務并行計算。

public class ForkJoinExample extends RecursiveTask<Integer> {private final int threshold = 5;private int first;private int last;public ForkJoinExample(int first, int last) {this.first = first;this.last = last;}@Overrideprotected Integer compute() {int result = 0;if (last - first <= threshold) {// 任務足夠小則直接計算for (int i = first; i <= last; i++) {result += i;}} else {// 拆分成小任務int middle = first + (last - first) / 2;ForkJoinExample leftTask = new ForkJoinExample(first, middle);ForkJoinExample rightTask = new ForkJoinExample(middle + 1, last);leftTask.fork();rightTask.fork();result = leftTask.join() + rightTask.join();}return result;} }public static void main(String[] args) throws ExecutionException, InterruptedException {ForkJoinExample example = new ForkJoinExample(1, 10000);ForkJoinPool forkJoinPool = new ForkJoinPool();Future result = forkJoinPool.submit(example);System.out.println(result.get()); }

ForkJoin 使用 ForkJoinPool 來啟動,它是一個特殊的線程池,線程數量取決于CPU 核數。

public class ForkJoinPool extends AbstractExecutorService

ForkJoinPool 實現了工作竊取算法來提高 CPU 的利用率。

  • 每個線程都維護了一個雙端隊列,用來存儲需要執行的任務。
  • 工作竊取算法允許空閑的線程從其它線程的雙端隊列中竊取一個任務來執行。
  • 竊取的任務必須是最晚的任務,避免和隊列所屬線程發生競爭。但是如果隊列中只有一個任務時還是會發生競爭。

?

?

總結

以上是生活随笔為你收集整理的AQS(CountdownLatch、CyclicBarrier、Semaphore)、FutureTask、BlockingQueue、ForkJoin的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一级免费毛片 | 亚洲欧美动漫 | 欧美福利一区 | 日本性视频网站 | 国产一区二区不卡 | 成人福利视频 | 香蕉视频免费在线观看 | 欧美天堂在线视频 | 欧美黄色录像 | 人人干av| 国产专区第一页 | 成人吃奶视频 | 91成年版 | 日韩欧美精品国产 | 国产精品国产三级国产播12软件 | 香蕉视频免费 | 国产老熟妇精品观看 | 人人爱人人看 | 老司机午夜视频 | 日韩黄色高清视频 | 天天摸日日操 | 动漫同人高h啪啪爽文 | 影音先锋国产在线 | 怡红院亚洲 | 欧美一区二区三区免费视频 | 日韩激情在线视频 | 中文字av | 亚洲国产传媒 | 午夜性激情 | 久久丫精品国产亚洲av不卡 | 亚洲一区二区三区婷婷 | www.国产一区二区三区 | 欧美乱妇15p | 91久久久久久久 | 动漫av在线免费观看 | 91精品国产自产精品男人的天堂 | 午夜神马福利 | 国产精品成人一区二区网站软件 | 奶波霸巨乳一二三区乳 | 国内精品久久99人妻无码 | 伊人网av在线| 国产性―交―乱―色―情人 | 成年人国产精品 | www.色图 | 久久综合综合久久 | 黑人巨大精品欧美一区二区 | 免费欧美日韩 | 国产精品色婷婷99久久精品 | 欧美一级片在线播放 | 波多野吉衣毛片 | 交专区videossex农村 | 日韩毛片在线看 | 免费成人高清 | 亚洲在线免费观看视频 | 国产91清纯白嫩初高中在线观看 | 91综合精品 | 西方av在线| 污网站在线观看免费 | 影音先锋在线看 | 午夜综合 | 国产无遮挡18禁无码网站不卡 | 久久久久久免费视频 | 亚洲精选av | 在线免费看黄色片 | 少妇又紧又色又爽又刺激 | 久草精品在线 | 亚洲色图小说 | 欧美人妻一区二区 | 国产精品激情偷乱一区二区∴ | 日韩一级av毛片 | 国语对白一区二区 | 噼里啪啦免费高清看 | 婷婷免费视频 | 最新网址av | 嫩草影院在线视频 | 午夜神马福利 | 美国毛片网站 | 日日噜噜噜噜人人爽亚洲精品 | 久久这里只有精品首页 | 男人天堂手机在线 | 国产精品精品久久久久久 | 姐姐你真棒插曲快来救救我电影 | 岛国精品一区 | 国产精品你懂的 | 摸一摸操一操 | 99精品在线免费观看 | 色婷婷香蕉在线一区二区 | 久热这里只有 | 成年人免费在线观看网站 | 91水蜜桃| 国产精品三级在线 | 亚洲久久影院 | 欧美特黄aaa | 色综合91| 亚洲欧美日韩在线一区二区 | 国产精品免费看片 | youjizz国产 | 天天国产视频 | 成人片在线免费看 |