日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

通過線程池方式改造Stream.parallel()并行流

來源: 責編: 時間:2023-10-13 14:36:41 249觀看
導讀大家好,我是哪吒。上一篇簡單聊一聊公平鎖和非公平鎖,parallel并行流,提到了一個IntStream.rangeClosed并行流問題,很多小伙伴,對這個比較陌生,想用線程池的方式改造一下。一、IntStream.rangeClosed并行流@Datapublic clas

guf28資訊網——每日最新資訊28at.com

大家好,我是哪吒。

上一篇簡單聊一聊公平鎖和非公平鎖,parallel并行流,提到了一個IntStream.rangeClosed并行流問題,很多小伙伴,對這個比較陌生,想用線程池的方式改造一下。guf28資訊網——每日最新資訊28at.com

一、IntStream.rangeClosed并行流

@Datapublic class LockTest1 {    public static void main(String[] args) {        IntStream.rangeClosed(1, 100000).parallel().forEach(i -> new LockTest1().increase());        System.out.println(time);    }    private static int time = 0;    private static Object lock = new Object();    public void increase() {        synchronized (lock) {            time++;        }    }}

二、線程池方式改造

不會那些新特性,還是原始的香啊,寫起代碼,得心應手。guf28資訊網——每日最新資訊28at.com

1、創建線程池

這時候,有些小伙伴,又陷入了選擇恐懼癥。用哪個線程池比較好呢?guf28資訊網——每日最新資訊28at.com

簡單回顧一下:guf28資訊網——每日最新資訊28at.com

  • 單線程池newSingleThreadExecutor(),只有一個核心線程的線程池,保證任務按FIFO順序一個個執行;
  • 固定線程數線程池newFixedThreadPool(10),固定數量的可復用的線程數,來執行任務。當線程數達到最大核心線程數,則加入隊列等待有空閑線程時再執行;
  • 可緩存線程池newCachedThreadPool(),創建的都是非核心線程,而且最大線程數為Interge的最大值,空閑線程存活時間是1分鐘。如果有大量耗時的任務,則不適該創建方式,它只適用于生命周期短的任務;
  • 固定線程數newScheduledThreadPool(10),支持定時和周期性任務newScheduledThreadPool(10),顧名思義,在固定線程數的前提下,添加了定時任務。

最常用的還是固定線程數線程池newFixedThreadPool(10)。guf28資訊網——每日最新資訊28at.com

@Datapublic class LockTest2 {    public static void main(String[] args) {        ExecutorService executorService = Executors.newFixedThreadPool(200);        for (int i = 0; i < 100000; i++) {            Thread0926 thread = new Thread0926();            executorService.execute(thread);        }        System.out.println(time);    }    private static int time = 0;    private static Object lock = new Object();    public void increase() {        synchronized (lock) {            time++;        }    }}

2、線程類

public class Thread0926 implements Runnable{    @Override    public void run() {        LockTest2 lockTest = new LockTest2();        lockTest.increase();    }}

3、信心滿滿,走起來

我草,這不對啊,不應該是100000嘛?又把老子整不會了~guf28資訊網——每日最新資訊28at.com

guf28資訊網——每日最新資訊28at.com

三、再次解決并發時i++原子性問題

上一篇測試過,使用synchronized代碼塊是可以解決i++線程安全問題的,這次怎么不好使了?guf28資訊網——每日最新資訊28at.com

上面的代碼中,synchronized (lock)鎖住了time++,lock是靜態變量,所以屬于類級別的鎖。但是新建的線程是一個新的類,超出了鎖的范圍,所以失效。guf28資訊網——每日最新資訊28at.com

那么,在當前類中,開啟線程,是不是就可以了呢?試一下guf28資訊網——每日最新資訊28at.com

public class LockTest4 {    private static int time = 0;    private static Object lock = new Object();    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 200; i++) {            Thread thread = new Thread(() -> {                for (int j = 0; j < 500; j++) {                    synchronized (lock) {                        time++;                    }                }            });            thread.start();        }        Thread.sleep(3000);        System.out.println(time);    }}

當然,在synchronized代碼塊中,使用synchronized (LockTest4.class)也是可以的,效果是一樣的。guf28資訊網——每日最新資訊28at.com

guf28資訊網——每日最新資訊28at.com

四、并行流與多線程

并行流的本質的是并行,多線程的本質是并發。guf28資訊網——每日最新資訊28at.com

并行指當多核CPU中的一個CPU執行一個線程時,其它CPU能夠同時執行另一個線程,兩個線程之間不會搶占CPU資源,可以同時運行。guf28資訊網——每日最新資訊28at.com

并發指在一段時間內CPU處理多個線程,這些線程會搶占CPU資源,CPU資源根據時間片周期在多個線程之間來回切換,多個線程在一段時間內同時運行,而在同一時刻不是同時運行的。guf28資訊網——每日最新資訊28at.com

1、并行和并發的區別?

  • 并行指多個線程在一段時間的每個時刻都同時運行,并發指多個線程在一段時間內同時運行(不是同一時刻,一段時間內交叉執行)。
  • 并行的多個線程不會搶占系統資源,并發的多個線程會搶占系統資源。
  • 并行是多CPU的產物,單核CPU中只有并發,沒有并行。

guf28資訊網——每日最新資訊28at.com

2、并行和并發的使用場景

(1)IO密集場景

場景應用程序開發,提供http接口、數據庫查詢、微服務調用都是IO請求,IO請求時幾乎不消耗cpu,這是為了提供cup使用率,建議使用多線程并發,線程數可以遠大于cpu核數。guf28資訊網——每日最新資訊28at.com

(2)cup密集場景

對應大量的加減乘除運算、md5、hash等運算操作,需要持續使用cpu,需要讓多核cpu并行運算,適合使用forkjoin并行計算guf28資訊網——每日最新資訊28at.com

技術場景多線程不足,使用多線程技術,也能提高性能,但是線程設置過大會浪費cpu線程切換的時間,如果線程任務分配不均勻,會導致有的cpu忙碌有的cpu空閑。guf28資訊網——每日最新資訊28at.com

guf28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-13523-0.html通過線程池方式改造Stream.parallel()并行流

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C# Dev Kit for Visual Studio Code 用法詳解

下一篇: Java中equals和==的區別

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力。  CRM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
Top 主站蜘蛛池模板: 江达县| 蓬安县| 镇远县| 固始县| 杭锦旗| 汤原县| 陵水| 河西区| 清涧县| 祁连县| 保康县| 铁岭市| 扬中市| 长白| 京山县| 息烽县| 化德县| 汝城县| 平利县| 盐山县| 垦利县| 云安县| 平罗县| 唐海县| 库尔勒市| 肇州县| 宁国市| 九龙坡区| 赞皇县| 新平| 盐津县| 望江县| 和田市| 定安县| 外汇| 巢湖市| 襄城县| 钟祥市| 平罗县| 衡山县| 镇赉县|