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

java 線程池實現(xiàn)多線程處理list數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了java 線程池實現(xiàn)多線程處理list數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

newFixedThreadPool線程池實現(xiàn)多線程

		List<PackageAgreementEntity> entityList = new CopyOnWriteArrayList<>();
        //多線程   10個線程
        //int threadNum = 10;
        int listSize = 300;
        List<List<PackageAgreementDto>> splitData = Lists.partition(packageAgreementList, listSize);
        //CountDownLatch latch = new CountDownLatch(splitData.size());
        //聲明線程池對象
        ExecutorService touchWorker = Executors.newFixedThreadPool(splitData.size());
        //不加這個會導致線程不安全,丟失數(shù)據(jù)
        Semaphore semaphore = new Semaphore(splitData.size());//定義幾個許可
        List<PackageAgreementErroDto> errorList2 = new CopyOnWriteArrayList();

        for (int i = 0; i < packageAgreementList.size(); i++) {
            final  int j = i;
            semaphore.acquire();
            touchWorker.execute(()->{
                try {
                        logger.info(Thread.currentThread().getName()+ j);
                        logger.info("數(shù)據(jù)第幾條:" + j);
                        //校驗物料、供應商、ou、地點信息是否存在
                        packageAgreementService.checkMultiData(packageAgreementList.get(j), j ,user, dateFormat,  errorList2, entityList);

                        semaphore.release();
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            });
        }
        //每隔10s檢測線程是否執(zhí)行結束
        boolean flag = touchWorker.awaitTermination(10, TimeUnit.SECONDS);
         if(!flag){
            logger.info("一攬子協(xié)議價格錄入完成!");
        }

需要注意的問題點,多線程處理List數(shù)據(jù)可能發(fā)生線程不安全,
引入CopyOnWriteArrayList,Semaphore解決,或者加鎖解決問題;所有線程執(zhí)行完畢后再進行后續(xù)業(yè)務的處理,引入awaitTermination()方法。

發(fā)現(xiàn)上述邏輯有問題,被其他資料誤導,awaitTermination并不是上述描述的作用。為了保證線程池的所有線程執(zhí)行完畢,優(yōu)化后代碼如下:

		AtomicInteger count = new AtomicInteger();
/**
         * 采用線程池處理數(shù)據(jù),減少時耗,線程池數(shù)量為10
         */
        int threadNum = 10;
        ExecutorService touchWorker = Executors.newFixedThreadPool(threadNum);
        Semaphore semaphore = new Semaphore(threadNum);//定義幾個許可

        for(TeamWorkMainConfirmInfoDto confirmInfoDto:list){
            semaphore.acquire();
            touchWorker.execute(()->{
                try {

                    //根據(jù)主表id查詢要導出的子流程信息
                    List<TeamWorkInfoExportDto> slaveInfoDtoList = teamWorkSlaveInfoService.findExportSlaveListByMainId(confirmInfoDto.getId());
                    lock.lock();
                    if(slaveInfoDtoList != null && slaveInfoDtoList.size() >0){
                        for(TeamWorkInfoExportDto slaveInfoDto:slaveInfoDtoList){
                            exportList.add(slaveInfoDto);
                        }
                    }else{  //如果沒有子流程數(shù)據(jù),添加主流程數(shù)據(jù)到導出數(shù)據(jù)中
                        TeamWorkInfoExportDto mainDto = new TeamWorkInfoExportDto();
                        mainDto.setTaskBookName(confirmInfoDto.getTaskBookName());
                        exportList.add(mainDto);

                    }

                    count.getAndIncrement();
                    logger.info("第" + count + "條數(shù)據(jù)!");
                    lock.unlock();
                    semaphore.release();
                } catch (Exception e){
                    e.printStackTrace();
                }
            });

        }

        //判斷所有線程是否都執(zhí)行完
        //EndTask endTask = new EndTask(list.size());
        //touchWorker.execute(endTask);
        while(true) {
            if(list.size() == count.intValue()) {

                logger.info("研發(fā)任務書多線程導出完成!");
                break;

            }else {
                logger.info("研發(fā)任務書導出線程池的任務沒有完成,等待。。。");
                Thread.sleep(1000);
            }
        }
        touchWorker.shutdown();

count 未使用靜態(tài)變量的原因:使用static靜態(tài)變量還需要在線程池結束后初始化,而且可能出現(xiàn)多用戶競爭資源的現(xiàn)象導致出現(xiàn)問題。而且AtomicInteger 能有效保證原子性(用于后續(xù)驗證所有線程執(zhí)行完成)文章來源地址http://www.zghlxwxcb.cn/news/detail-667264.html

到了這里,關于java 線程池實現(xiàn)多線程處理list數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • Java 多線程批量處理數(shù)據(jù)

    1 需求 在項目開發(fā)中需要處理100萬多的數(shù)據(jù),這些數(shù)據(jù)需要從mysql數(shù)據(jù)庫中讀取出來,再通過調用其他平臺的接口推送數(shù)據(jù)。由于時間緊迫,數(shù)據(jù)需要在短時間內(nèi)完成推送,采用單線程推送很慢,所以采用多線程推送來提高效率。 2 配置多線程 2.1 application.yml 2.2 創(chuàng)建ThreadPoo

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

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

    2024年02月09日
    瀏覽(19)
  • Java8對List集合中的數(shù)據(jù)進行過濾處理

    目錄 0.需求場景 1.編碼實現(xiàn) ????????假設有這樣一個需求,將List中所有超過 35 歲的員工剔除,該如何實現(xiàn)呢?我們可以利用 Java8 的流式編程,輕松的實現(xiàn)這個需求。 ? ? ? ? 當然也不局限與上述場景,對應的處理方法適用與根據(jù) List 中元素或元素的屬性,對 List 進行處

    2024年02月15日
    瀏覽(94)
  • Java使用線程池批量處理數(shù)據(jù)操作

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

    疑問思路: 1.如何保證數(shù)據(jù)按順序批量處理 2.如何保證數(shù)據(jù)全部處理完統(tǒng)一返回 3.如何保證是多任務異步操作 4.如何提高運行效率,減少運行時間 1.使用ArrayList 插入數(shù)據(jù)有序且可重復 2.CountDownLatch / Future / CompletableFuture 3.多線程 4.線程池創(chuàng)建多線程 具體流程: 獲取需要進行批

    2024年02月09日
    瀏覽(21)
  • JAVA多線程處理for循環(huán)數(shù)據(jù)

    JAVA多線程處理for循環(huán)數(shù)據(jù)

    對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程與子線程無先后順序 執(zhí)行結果: 對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程在所有子線程執(zhí)行完成之后執(zhí)行 執(zhí)行結果: 對for循環(huán)內(nèi)數(shù)據(jù)啟用多線程執(zhí)行,主線程在所有子線程執(zhí)行完成之后執(zhí)行 執(zhí)行結果: 4. JAVA多線程10個線程處理100

    2024年02月11日
    瀏覽(27)
  • for循環(huán)內(nèi)線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行java的實現(xiàn)方式

    for循環(huán)內(nèi)線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行 方式一 使用 CountDownLatch 在 Java 中,您可以使用 CountDownLatch 來實現(xiàn)主線程等待子線程執(zhí)行完成的功能。CountDownLatch 是一個同步工具類,它允許一個或多個線程等待其他線程完成操作后再繼續(xù)執(zhí)行。 具

    2024年02月11日
    瀏覽(22)
  • 流式計算中的多線程處理:如何使用Kafka實現(xiàn)高效的實時數(shù)據(jù)處理

    作者:禪與計算機程序設計藝術 Apache Kafka 是 Apache Software Foundation 下的一個開源項目,是一個分布式的、高吞吐量的、可擴展的消息系統(tǒng)。它最初由 LinkedIn 開發(fā)并于 2011 年發(fā)布。與其他一些類似產(chǎn)品相比,Kafka 有著更強大的功能和活躍的社區(qū)支持。因此,越來越多的人開始使

    2024年02月12日
    瀏覽(22)
  • java中多線程去跑海量數(shù)據(jù)使用線程池批量ThreadPoolExecutor處理的方式和使用Fork/Join框架的方式那種效率高?

    在Java中,使用線程池(ThreadPoolExecutor)和使用Fork/Join框架來處理海量數(shù)據(jù)的效率取決于具體的應用場景和需求。下面是一些需要考慮的因素: 任務類型:如果任務是CPU密集型的,那么使用Fork/Join框架可能更高效,因為它可以自動進行任務分割和并行處理。如果任務是I/O密集

    2024年02月10日
    瀏覽(21)
  • 如何實現(xiàn)一個線程安全的list

    如何實現(xiàn)一個線程安全的list

    開發(fā)過程中,較常使用非線程安全的list,但遇到特定場景需要使用線程安全的,該如何使用呢? 是使用Vector,還是說有更好的實現(xiàn)方式? Vector的底層與ArrayList類似.都是以動態(tài)數(shù)組的方式進行對象的存儲,Vector與ArrayList的區(qū)別在于Vector是線程同步操作安全的,因為官方在可能

    2024年02月02日
    瀏覽(25)
  • Java入門7(異常處理,list集合)

    一般來講,程序出現(xiàn)錯誤的時候,大致情況有三種: 語法錯誤 運行時錯誤,指的是各程序運行的時候,出現(xiàn)的一些沒有想到的問題,比如除數(shù)為0,比如數(shù)組下標越界等等 邏輯錯誤,運行結果和與其結果不一致,俗稱bug ?Java中的異常處理機制主要用于處理運行時錯誤 ?運行

    2024年02月03日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包