日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: a天堂在线观看视频 | 国产 日韩 一区 | 黑丝美女av | a天堂资源 | 国产在线观看一区二区三区 | 国产美女www爽爽爽 www.国产毛片 | 国产青草视频在线观看 | 制服 丝袜 综合 日韩 欧美 | 亚洲乱码国产乱码精品精98午夜 | 免费成人高清 | 一级黄色性视频 | 欧美888 | 亚洲自拍在线观看 | 正在播放木下凛凛xv99 | 欧美性开放视频 | 色噜噜视频| 国产av毛片| 色婷婷国产精品综合在线观看 | 青青草一区二区 | 欧美色图一区二区 | jizz欧美大片 | 黄色福利视频网站 | 丰满少妇xoxoxo视频 | 国产精品自拍网 | 麻豆影视在线免费观看 | 日本黄色免费 | 91麻豆精品国产91久久久久久久久 | 少妇高潮露脸国语对白 | 性视频免费 | 久久a级片 | 99九九热| 91福利一区二区 | 国产亚洲制服欧洲高清一区 | 日韩中文字幕网 | 国产日韩欧美在线观看 | 欧美视频 | 亚洲 欧美 日韩 在线 | 欧美大片免费 | 91久久久国产精品 | 国产chinese男男网站大全 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 91精品国产综合久久久蜜臀 | 亚洲一区二区色 | 在线免费精品视频 | 亚洲天堂免费av | 免费无码一区二区三区 | 亚洲专区视频 | 国产极品久久久 | 精品无码国产污污污在线观看 | 精品久久久久久久久久久久久久 | 少妇色 | 黄色avav| 一道本在线观看视频 | 日韩精品一区二区三区免费视频 | 欧美裸体女人 | 成人黄色免费视频 | 欧美精品一区二区三区久久 | 波多野结衣小视频 | 麻豆传媒mv | 欧洲日韩一区二区三区 | 在线播放黄色av | 国产尤物网站 | 国产美女免费 | 天天干天天看 | 国产精品白嫩极品美女视频 | 欧美日韩国产91 | 人人射人人爽 | 欧美jizz18性欧美 | 亚洲精品小说 | 亚洲综合久 | 日本丰满少妇做爰爽爽 | 麻豆av片| 欧美乱轮视频 | 黄色女女 | 精品欧美黑人一区二区三区 | 韩国不卡av | 男人的天堂在线观看av | 国产伦视频| 9.1在线观看免费 | 911香蕉 | 五月婷婷天 | 99爱在线视频 | 久在线| 亚洲av无码一区二区乱子伦 | 国产丰满农村老妇女乱 | 亚洲精品成人影视 | 高清三区 | 99re在线| 一级片久久久久 | 欧美肥老妇视频九色 | 精品人妻一区二区三区日产乱码 | 四虎久久久久 | 91视频福利 | 天天谢天天干 | 成人在线毛片 | 国产精品日韩电影 | 亚洲精品久久久蜜桃网尤妮丝 | 男女视频一区二区 | 一区二区三区免费观看 |