欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java?for循環(huán)內(nèi)執(zhí)行多線程問(wèn)題

 更新時(shí)間:2023年03月10日 08:32:55   作者:熙街丶一人  
這篇文章主要介紹了java?for循環(huán)內(nèi)執(zhí)行多線程問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java用多線程來(lái)加快循環(huán)效率

線程池搭配閉鎖

涉及知識(shí):Executors(線程池)、CountDownLatch(閉鎖)

優(yōu)點(diǎn):代碼簡(jiǎn)潔,方便閱讀,性能穩(wěn)定;

缺點(diǎn):Executors創(chuàng)建的線程池是公用的,如果多個(gè)地方使用這種循環(huán)多線程的方式,就會(huì)搶奪線程池資源,這樣運(yùn)行速度也會(huì)降低;

import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class test{
 
    /** 固定的線程池(當(dāng)前線程池大小為5) */
    private static final ExecutorService executor = Executors.newFixedThreadPool(5);
    
    public static void main(String[] args) throws Exception {
        /**
         *  兩個(gè)要點(diǎn):
         *  1.用Executors實(shí)現(xiàn)固定大小的線程池,從而達(dá)到控制硬件資源消耗的目的。
         *  2.用CountDownLatch(閉鎖),來(lái)確保循環(huán)內(nèi)的多線程都執(zhí)行完成后,再執(zhí)行后續(xù)代碼
         */
        
        // 初始化數(shù)據(jù)
        List<Map<String,Object>> list = new ArrayList<>();
        for(int i=0;i<50;i++){
            Map<String,Object> object = new HashMap<>();
            object.put("index",i);
            list.add(object);
        }
 
        // 初始化計(jì)時(shí)器
        CountDownLatch cdl = new CountDownLatch(list.size());
        System.out.println("====== 線程開始 =====");
 
        // 遍歷
        for(Map<String,Object> object:list){
            // 開啟線程
            executor.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread t = Thread.currentThread();
                        String name = t.getName();
                        // 模擬運(yùn)行耗時(shí)
                        Thread.sleep(500);
                        System.out.println(name+":執(zhí)行到"+object.get("index"));
                        object.put("status","已經(jīng)執(zhí)行過(guò)");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 閉鎖-1
                    cdl.countDown();
                }
            });
        }
        
        // 調(diào)用閉鎖的await()方法,該線程會(huì)被掛起,它會(huì)等待直到count值為0才繼續(xù)執(zhí)行
        // 這樣我們就能確保上面多線程都執(zhí)行完了才走后續(xù)代碼
        cdl.await();
        
        //關(guān)閉線程池
        executor.shutdown();
        System.out.println("====== 線程結(jié)束 =====");
 
        // 校驗(yàn)多線程正確性
        for(Map<String,Object> object:list){
            System.out.println(object.get("index") + ":" + object.get("status"));
        }
 
    }
}

for循環(huán)中使用多線程

每個(gè)service負(fù)責(zé)一個(gè)業(yè)務(wù),多次進(jìn)行重復(fù)業(yè)務(wù)就要使用到for循環(huán),例如對(duì)某個(gè)存儲(chǔ)id的集合遍歷,并為每個(gè)id創(chuàng)建一些東西。

但是使用單線程執(zhí)行任務(wù)會(huì)因?yàn)榈却洗稳蝿?wù)執(zhí)行完而浪費(fèi)很多時(shí)間,并且一旦某次執(zhí)行報(bào)錯(cuò),任務(wù)就會(huì)停止執(zhí)行,明顯不符合我們的要求。

這種情況就在for循環(huán)中使用多線程。

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
 
public class Test {
 
    /**
     * ThreadPool 自定義一個(gè)線程池
     */
    private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(60000));
 
    public static void main(String[] args) {
        //自己的數(shù)組或集合,這里不再進(jìn)行填充
        String[] ids = new String[10]
        
        for (String id : ids) {
            EXECUTOR.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        //需要執(zhí)行的業(yè)務(wù)邏輯
                        System.out.println("業(yè)務(wù)邏輯正在執(zhí)行");
                    } catch (Exception e) {
                        //todo
                    }
                }
            });
        }
    }
 
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springmvc返回html頁(yè)面問(wèn)題如何解決

    Springmvc返回html頁(yè)面問(wèn)題如何解決

    這篇文章主要介紹了Springmvc返回html頁(yè)面問(wèn)題如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot環(huán)境Druid數(shù)據(jù)源使用及特點(diǎn)

    SpringBoot環(huán)境Druid數(shù)據(jù)源使用及特點(diǎn)

    Druid 是目前比較流行的高性能的,分布式列存儲(chǔ)的OLAP框架(具體來(lái)說(shuō)是MOLAP)。本文給大家分享SpringBoot環(huán)境Druid數(shù)據(jù)源使用及特點(diǎn)介紹,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • SpringBoot實(shí)現(xiàn)OneDrive文件上傳的詳細(xì)步驟

    SpringBoot實(shí)現(xiàn)OneDrive文件上傳的詳細(xì)步驟

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)OneDrive文件上傳的詳細(xì)步驟,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),對(duì)大家實(shí)現(xiàn)OneDrive文件上傳有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 帶你走進(jìn)Maven的大門-最全Maven配置及集成idea工具總結(jié)

    帶你走進(jìn)Maven的大門-最全Maven配置及集成idea工具總結(jié)

    Maven項(xiàng)目對(duì)象模型(POM),是一個(gè)項(xiàng)目管理工具可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)建,報(bào)告和文檔的軟件.那我們想要在IDEA中使用Maven得進(jìn)行一些配置,接下來(lái)我們具體看一下是如何配置使用的,需要的朋友可以參考下
    2021-06-06
  • Spring AOP源碼深入分析

    Spring AOP源碼深入分析

    這篇文章主要介紹了Spring AOP源碼,AOP(Aspect Orient Programming),直譯過(guò)來(lái)就是 面向切面編程,AOP 是一種編程思想,是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充
    2023-01-01
  • Linux系統(tǒng)Java環(huán)境配置教程

    Linux系統(tǒng)Java環(huán)境配置教程

    這篇文章給大家介紹的Linux 系統(tǒng)Java環(huán)境配置教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享

    SpringBoot整合Caffeine實(shí)現(xiàn)本地緩存的實(shí)踐分享

    緩存是提升系統(tǒng)性能的一個(gè)不可或缺的工具,通過(guò)緩存可以避免大部分重復(fù)的請(qǐng)求到數(shù)據(jù)庫(kù)層,減少IO鏈接次數(shù),提升整體的響應(yīng)速率,本地緩存中比較常見的比如 Caffeine 緩存,這篇文章將結(jié)合具體的 Springboot 項(xiàng)目搭配 Caffeine 實(shí)現(xiàn)本地緩存的各種使用方式
    2024-07-07
  • Spring?Security過(guò)濾器鏈加載執(zhí)行流程源碼解析

    Spring?Security過(guò)濾器鏈加載執(zhí)行流程源碼解析

    Spring?Boot?對(duì)于?Spring?Security?提供了自動(dòng)化配置方案,可以使用更少的配置來(lái)使用?Spring?Security。那么這個(gè)過(guò)濾器鏈?zhǔn)窃趺醇虞d和實(shí)現(xiàn)攔截的呢,對(duì)Spring?Security過(guò)濾器鏈加載執(zhí)行流程感興趣的朋友一起看看吧
    2021-12-12
  • IDEA打包maven多模塊相互依賴項(xiàng)目全過(guò)程

    IDEA打包maven多模塊相互依賴項(xiàng)目全過(guò)程

    這篇文章主要介紹了IDEA打包maven多模塊相互依賴項(xiàng)目全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java之單鏈表問(wèn)題解決案例講解

    Java之單鏈表問(wèn)題解決案例講解

    這篇文章主要介紹了Java之單鏈表問(wèn)題解決案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論