国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java使用線程池批量處理數(shù)據(jù)操作

這篇具有很好參考價(jià)值的文章主要介紹了Java使用線程池批量處理數(shù)據(jù)操作。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java使用線程池批量處理數(shù)據(jù)操作

疑問&思路:

1.如何保證數(shù)據(jù)按順序批量處理
2.如何保證數(shù)據(jù)全部處理完統(tǒng)一返回
3.如何保證是多任務(wù)異步操作
4.如何提高運(yùn)行效率,減少運(yùn)行時(shí)間

1.使用ArrayList 插入數(shù)據(jù)有序且可重復(fù)
2.CountDownLatch / Future / CompletableFuture
3.多線程
4.線程池創(chuàng)建多線程

具體流程:

Java使用線程池批量處理數(shù)據(jù)操作

  • 獲取需要進(jìn)行批量更新的大集合oldList,對大集合進(jìn)行拆分操作,分成N個(gè)小集合nweList-1 ~ nweList-N 。
  • 開啟線程池,針對集合的大小進(jìn)行調(diào)參,對小集合進(jìn)行批量更新操作。
  • 對流程進(jìn)行控制,控制線程執(zhí)行順序。

創(chuàng)建List分割工具類:

public class ListSplitUtils {

    //這里使用泛型T 接收  做到通用工具類
    //resList總數(shù)據(jù)List  subListLength:需要切割的長度
    public static <T> List<List<T>> split(List<T> resList, int subListLength) {  
   
        if (CollectionUtils.isEmpty(resList) || subListLength <= 0) {
            return Lists.newArrayList();
        }
        List<List<T>> ret = Lists.newArrayList();
        int size = resList.size();
        if (size <= subListLength) {  //指定數(shù)據(jù)過小直接處理
            ret.add(resList);
        } else {
            int n = size / subListLength;
            int last = size % subListLength;
            // 分成n個(gè)集合,每個(gè)大小都是 subListLength 個(gè)元素
            for (int i = 0; i < n; i++) {
                List<T> itemList = Lists.newArrayList();
                for (int j = 0; j < subListLength; j++) {
                    itemList.add(resList.get(i * subListLength + j));
                }
                ret.add(itemList);
            }
            // last的進(jìn)行處理
            if (last > 0) {
                List<T> itemList = Lists.newArrayList();
                for (int i = 0; i < last; i++) {
                    itemList.add(resList.get(n* subListLength + i));
                }
                ret.add(itemList);
            }
        }
        return ret;
    }

創(chuàng)建線程池:

// 初始化線程池
/**
* corePoolSize: 一直保持的線程的數(shù)量,即使線程空閑也不會釋放。除非設(shè)置了 allowCoreThreadTimeout 為 true;
* maxPoolSize:允許最大的線程數(shù),隊(duì)列滿時(shí)開啟新線程直到等于該值;
* keepAliveTime:表示空閑線程的存活時(shí)間。當(dāng)線程空閑時(shí)間達(dá)到keepAliveTime,該線程會退出,直到線程數(shù)量等于corePoolSize。只有當(dāng)線程池中的線程數(shù)大于corePoolSize時(shí)keepAliveTime才會起作用,直到線程中的線程數(shù)不大于corepoolSIze;
* TimeUnitunit:表示keepAliveTime的單位;
* workQueue:緩存任務(wù)的隊(duì)列;
* handler:表示當(dāng) workQueue 已滿,且池中的線程數(shù)達(dá)到 maxPoolSize 時(shí),線程池拒絕添加新任務(wù)時(shí)采取的策略。
*/
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 50, 4, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadPoolExecutor.AbortPolicy());
        //大集合拆分成N個(gè)小集合,保證多線程異步執(zhí)行, 過大容易回到單線程
        List<List<CheckRecordDetailsDanger>> splitNList = ListSplitUtils.split(CheckRecordDetailsDangerPage, 100); //先設(shè)置100  100以內(nèi)不考慮性能
        // 記錄單個(gè)任務(wù)的執(zhí)行次數(shù)
        CountDownLatch countDownLatch = new CountDownLatch(splitNList.size());

        for (List<CheckRecordDetailsDanger> singleList : splitNList) {
            // 線程池執(zhí)行
            threadPool.execute(new Thread(() -> {
                for (CheckRecordDetailsDanger checkRecordDetailsDanger : singleList) {
                    //統(tǒng)一賦值方法
                    //unifySetData(checkRecordDetailsDanger);  這是我的方法,需要替換成自己的處理邏輯
                    countDownLatch.countDown();
                }
            }));
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

后話

學(xué)習(xí)過程中可以了解一下 CountDownLatch 和 Future 以及 ThreadPoolExecutor 。文章來源地址http://www.zghlxwxcb.cn/news/detail-486048.html

到了這里,關(guān)于Java使用線程池批量處理數(shù)據(jù)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • HBase的數(shù)據(jù)批量操作與事務(wù)處理

    HBase是一個(gè)分布式、可擴(kuò)展、高性能的列式存儲系統(tǒng),基于Google的Bigtable設(shè)計(jì)。它是Hadoop生態(tài)系統(tǒng)的一部分,可以與HDFS、MapReduce、ZooKeeper等組件集成。HBase具有高可用性、高可擴(kuò)展性和高性能等特點(diǎn),適用于大規(guī)模數(shù)據(jù)存儲和實(shí)時(shí)數(shù)據(jù)處理。 在大數(shù)據(jù)時(shí)代,數(shù)據(jù)的批量操作和

    2024年02月22日
    瀏覽(33)
  • 解決在使用 Elasticsearch(ES)多線程批量操作時(shí)導(dǎo)致并發(fā)一致性的問題??!

    解決在使用 Elasticsearch(ES)多線程批量操作時(shí)導(dǎo)致并發(fā)一致性的問題??!

    先說一下什么是數(shù)據(jù)庫數(shù)據(jù)庫中 并發(fā)一致性 問題! 1、在并發(fā)環(huán)境下,事務(wù)的隔離性很難保證,因此會出現(xiàn)很多并發(fā)一致性問題。 數(shù)據(jù)丟失 T1 和 T2 兩個(gè)事務(wù)都對一個(gè)數(shù)據(jù)進(jìn)行修改,T1 先修改,T2 隨后修改,T2 的修改覆蓋了 T1 的修改。 讀臟數(shù)據(jù) T1 修改一個(gè)數(shù)據(jù),T2 隨后讀取

    2024年02月04日
    瀏覽(26)
  • Python地理數(shù)據(jù)處理 22:基于arcpy批量操作(四)

    Python地理數(shù)據(jù)處理 22:基于arcpy批量操作(四)

    代碼描述:遍歷a文件夾下的所有tif影像,并使用每個(gè)a文件夾中的tif影像對b文件夾下的所有tif影像進(jìn)行裁剪。裁剪后的柵格將以兩個(gè)tif文件進(jìn)行組合命名,并保存到另一個(gè)文件夾中。 獲取柵格數(shù)據(jù)的平均值,并輸出程序運(yùn)行進(jìn)度: 程序運(yùn)行進(jìn)度: 某文件夾中包含多個(gè)子文件

    2024年02月04日
    瀏覽(21)
  • python實(shí)現(xiàn)視頻抽幀,文件批量操作,文件批量處理(數(shù)據(jù)集制作的工具箱)

    環(huán)境準(zhǔn)備 數(shù)據(jù)集制作 文件批量重命名 文件批量移動 將文件批量按照一定格式進(jìn)行重命名 修改xml文件內(nèi)容的方法 Pathlib庫的常用接口 在計(jì)算機(jī)視覺項(xiàng)目中,文件批量操作和文件批量預(yù)處理是必不可少的步驟。它們涉及處理大量的圖像文件,包括讀取、處理、保存和預(yù)處理。

    2024年02月09日
    瀏覽(18)
  • Python地理數(shù)據(jù)處理 二十一:基于arcpy批量操作(三)

    實(shí)現(xiàn)將給定的 .shp 文件中的所有省份作為裁剪范圍,對給定的 .tif 文件進(jìn)行裁剪,輸出所有省份的單獨(dú) .tif 文件: 實(shí)現(xiàn)對文件名前14個(gè)字符一樣的tif圖像進(jìn)行柵格運(yùn)算求和: 如:XXXX_XXX_2003.M01_Mean、XXXX_XXX_2003.M02_Mean、XXXX_XXX_2003.M03_Mean;XXXX_XXX_2004.M01_Mean、XXXX_XXX_2004.M02_Mean、

    2024年02月01日
    瀏覽(22)
  • 【SpringBoot】springboot數(shù)據(jù)使用多線程批量入數(shù)據(jù)庫

    springboot、mybatisPlus、mysql8 mysql8(部署在1核2G的服務(wù)器上,很卡,所以下面的數(shù)據(jù)條數(shù)用5000,太大怕不是要等到花兒都謝了 0.0) 共耗時(shí):180121 ms 耗時(shí)時(shí)間:87217ms 耗時(shí)時(shí)間: 28235 可見時(shí)間從180秒,縮短到了28秒,但是@Transactional對于多線程是控制不了所有的事務(wù)的。 Spring實(shí)現(xiàn)

    2024年02月02日
    瀏覽(23)
  • HBase Java API 開發(fā):批量操作 第2關(guān):批量刪除數(shù)據(jù)

    刪除單行數(shù)據(jù) 刪除一行數(shù)據(jù)很簡單,我們來看個(gè)示例: 這段代碼就可以刪除行鍵為 row1 的行。 刪除多行數(shù)據(jù) 如何刪除多行數(shù)據(jù)呢? 相信你已經(jīng)猜到了,既然 get() 方法有重載方法,那應(yīng)該 delete() 方法也有,確實(shí): 這樣就可以刪除多行數(shù)據(jù)啦。 編程要求 還等啥,親自試一試

    2024年02月05日
    瀏覽(137)
  • java 線程池實(shí)現(xiàn)多線程處理list數(shù)據(jù)

    需要注意的問題點(diǎn),多線程處理List數(shù)據(jù)可能發(fā)生線程不安全, 引入CopyOnWriteArrayList,Semaphore解決,或者加鎖解決問題;所有線程執(zhí)行完畢后再進(jìn)行后續(xù)業(yè)務(wù)的處理,引入awaitTermination()方法。 發(fā)現(xiàn)上述邏輯有問題,被其他資料誤導(dǎo),awaitTermination并不是上述描述的作用。為了保

    2024年02月11日
    瀏覽(17)
  • 使用 multiprocessing 多進(jìn)程處理批量數(shù)據(jù)

    使用 multiprocessing 多進(jìn)程處理批量數(shù)據(jù)

    示例代碼 multiprocessing.Pool 創(chuàng)建進(jìn)程池, 傳入的參數(shù)是要要使用的 CPU 內(nèi)核數(shù)量, 直接用 cpu_count() 可以拿到當(dāng)前硬件配置所有的 CPU 內(nèi)核數(shù). pool.map 可以直接將處理后的結(jié)果拼接成一個(gè) list 對象 應(yīng)用在實(shí)際數(shù)據(jù)處理代碼的效果對比: 普通處理方式, 用時(shí) 221 秒 多進(jìn)程處理方式, 用時(shí)

    2024年02月09日
    瀏覽(22)
  • java 多線程處理大量并發(fā)數(shù)據(jù)

    Java中多線程是一種處理數(shù)據(jù)的常見方式,它可以同時(shí)執(zhí)行多個(gè)線程以提高程序的性能和效率。下面是一個(gè)使用多線程處理數(shù)據(jù)的示例代碼: 在上面的代碼中,我們創(chuàng)建了一個(gè)數(shù)組 data 來存儲待處理的數(shù)據(jù)。然后,我們創(chuàng)建了一個(gè)線程數(shù)組 threads ,用于存儲要執(zhí)行的線程。 通

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包