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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

多线程:了解一下ForkJoin、FutureTask、BlockingQueue

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程:了解一下ForkJoin、FutureTask、BlockingQueue 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先了解一下這三種類

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 來封裝這個任務,主線程在完成自己的任務之后再去獲取結果。get()方法會阻塞當前主線程,直到call()結束并返回。

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());} } other task is running... 4950

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();} } produce..produce..consume..consume..produce..consume..produce..consume..produce..consume..

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 的利用率。每個線程都維護了一個雙端隊列,用來存儲需要執行的任務。工作竊取算法允許空閑的線程從其它線程的雙端隊列中竊取一個任務來執行。竊取的任務必須是最晚的任務,避免和隊列所屬線程發生競爭。例如下圖中,Thread2 從 Thread1 的隊列中拿出最晚的 Task1 任務,Thread1 會拿出 Task2 來執行,這樣就避免發生競爭。但是如果隊列中只有一個任務時還是會發生競爭。

總結

以上是生活随笔為你收集整理的多线程:了解一下ForkJoin、FutureTask、BlockingQueue的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美一区二区三区的 | 国产999视频 | 亚洲av无码电影在线播放 | 国内自拍欧美 | 久久伊人久久 | 自拍第二页 | 人人干人 | 超碰午夜| 日韩三区在线 | 一二三av| 亚洲综合色婷婷 | 亚洲1234区| 欧美日韩女优 | 亚洲依依 | 免费一区二区三区视频在线 | 探花国产精品一区二区 | 啪啪一区二区 | av福利在线看 | 亚洲精品一区二区在线观看 | 亚洲激情久久久 | 一级理论片 | 婷婷激情五月网 | 国产免费二区 | 国产成人精品免费 | 羞羞羞网站 | 亚洲av无码国产综合专区 | 国精品一区 | 少妇精品亚洲一区二区成人 | 四级黄色片| 97福利网 | 午夜免费片 | 亚洲天堂中文 | 森泽佳奈av | 国产成人久久婷婷精品流白浆 | 国产又粗又长又爽 | 日韩福利视频导航 | 久久九九免费 | 米奇7777狠狠狠狠视频 | 国产一线二线在线观看 | 国产麻豆一精品一av一免费 | 91福利在线播放 | 欧美肉大捧一进一出免费视频 | 亚洲精品国产精品国 | 久色成人网 | 91精品福利 | 亚洲欧洲免费无码 | 瑟瑟视频在线免费观看 | 手机在线一区 | 亚洲成人免费在线 | 国产酒店自拍 | 亚洲五月六月 | 吻胸摸激情床激烈视频 | 超碰女优| 天堂成人国产精品一区 | 国产成人在线播放视频 | 欧美日韩图片 | 牛牛视频在线观看 | 强伦人妻一区二区三区视频18 | 国精产品一区二区 | 男女考妣视频 | 黄瓜视频在线观看 | 911精品国产一区二区在线 | 青青草欧美 | 男女做网站 | 成人免费无码大片a毛片抽搐色欲 | 国产一区视频在线 | 91成人精品国产刺激国语对白 | h在线免费观看 | 亚洲AV无码成人国产精品色 | 黄色片中文字幕 | 天海翼av在线 | 精品免费囯产一区二区三区 | 男人天堂av网 | 伊人久久精品一区二区三区 | 国产精品人妻一区二区三区 | 国产又粗又黄又猛 | 成人国产在线 | 高跟av| 亚洲欧美在线一区 | 亚洲一级片av | 日本不卡高字幕在线2019 | 少妇3p视频 | 欧美一级免费在线 | 欧洲免费毛片 | 韩日av网站 | 久久看视频 | 国产成人精品视频一区二区 | 9色av| 老色鬼在线 | 郑艳丽三级 | 中文字幕一区二区三区不卡 | 看片地址| 日韩一级中文字幕 | 欧美做受高潮中文字幕 | 欧美日韩在线视频一区二区 | 奇米影视在线观看 | 久久久久久久久久久久电影 | 91久久人人 | 亚洲一区二区三区av无码 |