最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

線程池搭配閉鎖

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

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

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

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

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

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

但是使用單線程執(zhí)行任務(wù)會因為等待上次任務(wù)執(zhí)行完而浪費很多時間,并且一旦某次執(zhí)行報錯,任務(wù)就會停止執(zhí)行,明顯不符合我們的要求。

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

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
 
public class Test {
 
    /**
     * ThreadPool 自定義一個線程池
     */
    private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(60000));
 
    public static void main(String[] args) {
        //自己的數(shù)組或集合,這里不再進行填充
        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é)

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

相關(guān)文章

  • spring boot整合Shiro實現(xiàn)單點登錄的示例代碼

    spring boot整合Shiro實現(xiàn)單點登錄的示例代碼

    本篇文章主要介紹了spring boot整合Shiro實現(xiàn)單點登錄的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Swagger2匹配多個controller代碼實例

    Swagger2匹配多個controller代碼實例

    這篇文章主要介紹了Swagger2匹配多個controller代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 舉例講解Java設(shè)計模式編程中Decorator裝飾者模式的運用

    舉例講解Java設(shè)計模式編程中Decorator裝飾者模式的運用

    這篇文章主要介紹了Java設(shè)計模式編程中Decorator裝飾者模式的運用,裝飾者模式就是給一個對象動態(tài)的添加新的功能,裝飾者和被裝飾者實現(xiàn)同一個接口,裝飾者持有被裝飾者的實例,需要的朋友可以參考下
    2016-05-05
  • 詳細解讀Hibernate的緩存機制

    詳細解讀Hibernate的緩存機制

    這篇文章主要介紹了詳細解讀Hibernate的緩存機制,具有一定參考價值,這里分享給大家,供大家學習參閱。
    2017-10-10
  • Java Iterator迭代器_動力節(jié)點Java學院整理

    Java Iterator迭代器_動力節(jié)點Java學院整理

    迭代器是一種模式,它可以使得對于序列類型的數(shù)據(jù)結(jié)構(gòu)的遍歷行為與被遍歷的對象分離,接下來通過本文給大家分享Java Iterator迭代器_動力節(jié)點Java學院整理,需要的朋友參考下吧
    2017-05-05
  • 修改Springboot默認序列化工具Jackson配置的實例代碼

    修改Springboot默認序列化工具Jackson配置的實例代碼

    這篇文章主要介紹了如何修改Springboot默認序列化工具Jackson的配置,當Spring容器中存在多個同類型的Bean時,默認情況下最后一個創(chuàng)建的Bean將作為首選Bean,文中通過代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Java 8 Stream 的終極技巧——Collectors 功能與操作方法詳解

    Java 8 Stream 的終極技巧——Collectors 功能與操作方法詳解

    這篇文章主要介紹了Java 8 Stream Collectors 功能與操作方法,結(jié)合實例形式詳細分析了Java 8 Stream Collectors 功能、操作方法及相關(guān)注意事項,需要的朋友可以參考下
    2020-05-05
  • Struts 2 實現(xiàn)Action的幾種方式

    Struts 2 實現(xiàn)Action的幾種方式

    本篇文章主要介紹了Struts 2 實現(xiàn)Action的幾種方式,Struts 2框架下實現(xiàn)Action類有三種方式,有興趣的可以了解一下
    2017-10-10
  • JAVA實現(xiàn)LRU算法的參考示例

    JAVA實現(xiàn)LRU算法的參考示例

    這篇文章主要介紹了JAVA實現(xiàn)LRU算法的參考示例,幫助大家根據(jù)需求實現(xiàn)算法,感興趣的朋友可以了解下
    2020-10-10
  • Java遞歸算法遍歷部門代碼示例

    Java遞歸算法遍歷部門代碼示例

    這篇文章主要介紹了Java遞歸算法遍歷部門代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論

文成县| 青阳县| 图木舒克市| 治多县| 肇东市| 卢湾区| 浮梁县| 崇阳县| 肥乡县| 阳泉市| 吉安县| 武夷山市| 三亚市| 梁平县| 遵义市| 芦山县| 汨罗市| 黔西县| 连州市| 泸水县| 常德市| 正镶白旗| 涿鹿县| 斗六市| 高雄市| 保定市| 海南省| 常德市| 南陵县| 齐齐哈尔市| 始兴县| 桓台县| 柘城县| 澳门| 沛县| 乾安县| 昆明市| 富裕县| 定日县| 文安县| 崇阳县|