在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

List集合:多線程快速處理

Android編程精選 ? 來源:CSDN ? 作者:CSDN ? 2022-06-02 11:24 ? 次閱讀

有一個(gè)大List集合,遍歷進(jìn)行一些耗時(shí)操作,不能達(dá)到性能要求,查詢?nèi)罩荆瑔蝹€(gè)任務(wù)雖然有不少數(shù)據(jù)庫和第三方API請(qǐng)求,比較耗時(shí),但返回效率尚可,所以優(yōu)先采用多線程方式進(jìn)行處理并行請(qǐng)求數(shù)據(jù)庫和第三方API,因?yàn)樘幚硗赀€要對(duì)list所屬的數(shù)據(jù)進(jìn)行操作,所以,線程池多線程處理要等待全部處理完。

相關(guān)的代碼如下:

@Test
publicvoidtestTB()
{
Listlist=newArrayList();
for(inti=0;i900;i++)
{
list.add("a");
}
ExecutorServicetouchWorker=Executors.newFixedThreadPool(4,newThreadFactoryBuilder().setNameFormat("touch-send-worker-%d").build());
intsize=list.size();
if(size>100)
{
intbatch=size%100==0?size/100:size/100+1;
for(intj=0;jintend=(j+1)*100;
if(end>size)
{
end=size;
}
ListsubList=list.subList(j*100,end);
touchWorker.execute(()->sleepTest(subList));
}
touchWorker.shutdown();
while(true)
{
if(touchWorker.isTerminated())
{
break;
}
}
}
else
{
sleepTest(list);
}
}
privatevoidsleepTest(ListsubList)
{
for(Stringi:subList)
{
try
{
//耗時(shí)操作
System.out.println("######"+i+"######"+Thread.currentThread().getName());
//Thread.sleep(1000*30);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
void shutdown()

啟動(dòng)一次順序關(guān)閉,執(zhí)行以前提交的任務(wù),但不接受新任務(wù)。若已經(jīng)關(guān)閉,則調(diào)用沒有其他作用。

拋出:SecurityException - 如果安全管理器存在并且關(guān)閉,此 ExecutorService 可能操作某些不允許調(diào)用者修改的線程(因?yàn)樗鼪]有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒絕訪問。

boolean isTerminated()

若關(guān)閉后所有任務(wù)都已完成,則返回true。注意除非首先調(diào)用shutdownshutdownNow,否則isTerminated永不為true。返回:若關(guān)閉后所有任務(wù)都已完成,則返回true。

當(dāng)然還有一種方法,是之前寫的,方法比上邊的臃腫了,不過會(huì)獲取返回結(jié)果進(jìn)行處理:邏輯是獲取所有頁面的List,多線程遍歷List后,將所有頁面的違規(guī)詞查出發(fā)送郵件,代碼:

/**
*落地頁違規(guī)詞排查(多線程)。
*@return
*/
@Test
publicvoidgetViolationsLandpageByThreadPool(){
try{
landPageService.getViolationsLandpageByThreadPool("1年");
}catch(Exceptione){
e.printStackTrace();
}
}

//開始時(shí)間
longstart=System.currentTimeMillis();
/*Listlist=newArrayList();
for(inti=1;i<=?3000;?i++)?{
????list.add(i?+?"");
}*/

Listlist=landPageDao.getPageIdAndPath();
//初始化敏感詞庫對(duì)象
SensitiveWordInitsensitiveWordInit=newSensitiveWordInit();
//從數(shù)據(jù)庫中獲取敏感詞對(duì)象集合(目前先放在資源文件中,等以后比較多或者需要界面操作時(shí)再用數(shù)據(jù)庫)
//構(gòu)建敏感詞庫
MapsensitiveWordMap=sensitiveWordInit.initKeyWord(vioKey);
//傳入SensitivewordEngine類中的敏感詞庫
SensitivewordEngine.sensitiveWordMap=sensitiveWordMap;
//每500條數(shù)據(jù)開啟一條線程
intthreadSize=11000;
//總數(shù)據(jù)條數(shù)
intdataSize=list.size();
//線程數(shù)
intthreadNum=dataSize/threadSize+1;
//定義標(biāo)記,過濾threadNum為整數(shù)
booleanspecial=dataSize%threadSize==0;

/*list.parallelStream().forEach(url->{});*/
//創(chuàng)建一個(gè)線程池
ExecutorServiceexec=Executors.newFixedThreadPool(threadNum);
//定義一個(gè)任務(wù)集合
List>>tasks=newArrayList>>();
Callable>task=null;
ListcutList=null;

//確定每條線程的數(shù)據(jù)
for(inti=0;iif(i==threadNum-1){
if(special){
break;
}
cutList=list.subList(threadSize*i,dataSize);
}else{
cutList=list.subList(threadSize*i,threadSize*(i+1));
}
// System.out.println("第"+(i + 1)+"組:"+ cutList.toString());
finalListlistStr=cutList;
task=newCallable>(){

@Override
publicListcall()throwsException{
// System.out.println(Thread.currentThread().getName()+"線程:"+ listStr.get(0).getPageId());
Listresult=newArrayList();
for(LandPagelandPage:listStr){
LongpageId=landPage.getPageId();
Stringpath=landPage.getPath();
Integerversion=landPage.getVersion();
StringpageUrl=landPage.getPageUrl();
StringactualUser=landPage.getActualUser();
IntegerpageType=landPage.getPageType();
if(StringUtils.isNotBlank(path)){
//調(diào)用第一個(gè)方法,獲取html字符串
Stringhtml=httpRequest(path);
//調(diào)用第二個(gè)方法,獲取包含的違規(guī)詞
if(StringUtils.isNotBlank(html)){
html=html.replaceAll("","");
//Stringbuffer=htmlFiter2(html);
SetbufferSet=SensitivewordEngine.getSensitiveWord(html,1);//得到敏感詞有哪些,傳入2表示獲取所有敏感詞//sensitiveWordFiltering(html);
/*String[]word={"備案","錯(cuò)過將延誤","僅需1980元"};
for(inti=0;i
String[]word={
"一年","1年學(xué)完","一年學(xué)完","1年內(nèi)學(xué)完","一年內(nèi)學(xué)完"
};
for(inti=0;iif(html.contains(word[i])){
bufferSet.add(word[i]);
}
}
if(null!=bufferSet&&bufferSet.size()>0){

StringsensitiveWord=bufferSet==null?null:bufferSet.toString();
if("[]".equals(sensitiveWord)){
sensitiveWord="";
}
LandPagepage=newLandPage();
page.setPageId(pageId);
page.setPath(path);
page.setVersion(version);
page.setDescription(sensitiveWord);
page.setPageUrl(pageUrl);
page.setActualUser(actualUser);
page.setPageType(pageType);
result.add(page);
System.out.println(pageUrl);
}
}
}
}
return(List)result;
}
};
//這里提交的任務(wù)容器列表和返回的Future列表存在順序?qū)?yīng)的關(guān)系
tasks.add(task);
}

List>>results=exec.invokeAll(tasks);
Listresult=newArrayList();
for(Future>future:results){
result.addAll(future.get());
}

//關(guān)閉線程池
exec.shutdown();
System.out.println("線程任務(wù)執(zhí)行結(jié)束");
System.err.println("執(zhí)行任務(wù)消耗了:"+(System.currentTimeMillis()-start)+"毫秒");

System.out.println("共有###########"+list.size());

result就是需要發(fā)送郵件的相關(guān)結(jié)果了

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    20032
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4808

    瀏覽量

    68812

原文標(biāo)題:多線程快速處理 List 集合,你學(xué)會(huì)了嗎?

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    socket 多線程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。 多線程編程的基本概
    的頭像 發(fā)表于 11-12 14:16 ?410次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與進(jìn)程池來提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?442次閱讀
    Python中<b class='flag-5'>多線程</b>和多進(jìn)程的區(qū)別

    一文掌握Python多線程

    使用線程可以把占據(jù)長時(shí)間的程序中的任務(wù)放到后臺(tái)去處理
    的頭像 發(fā)表于 08-05 15:46 ?891次閱讀

    ESP32會(huì)不會(huì)有多線程問題,需要加鎖嗎?

    ESP32會(huì)不會(huì)有多線程問題,需要加鎖嗎
    發(fā)表于 07-19 08:05

    多線程設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    最近在開發(fā) 延保服務(wù) 頻道頁時(shí),為了提高查詢效率,使用到了多線程技術(shù)。為了對(duì)多線程方案設(shè)計(jì)有更加充分的了解,在業(yè)余時(shí)間讀完了《圖解 Java 多線程設(shè)計(jì)模式》這本書,覺得收獲良多。本篇文章將介紹其中
    的頭像 發(fā)表于 06-26 14:18 ?381次閱讀
    從<b class='flag-5'>多線程</b>設(shè)計(jì)模式到對(duì) CompletableFuture 的應(yīng)用

    bootloader開多線程做引導(dǎo)程序,跳app初始化后直接進(jìn)hardfualt,為什么?

    如標(biāo)題,想做一個(gè)遠(yuǎn)程升級(jí)的項(xiàng)目,bootloader引導(dǎo)區(qū)域和app都是開多線程跑的,就是自己寫了個(gè)小的任務(wù)調(diào)度器,沒什么功能主要是想讓程序快速的響應(yīng),延時(shí)不會(huì)對(duì)其他程序造成堵塞,程序測(cè)試
    發(fā)表于 04-18 06:07

    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫多線程CPU密集型任務(wù)TaskPool】

    CPU密集型任務(wù)是指需要占用系統(tǒng)資源處理大量計(jì)算能力的任務(wù),需要長時(shí)間運(yùn)行,這段時(shí)間會(huì)阻塞線程其它事件的處理,不適宜放在主線程進(jìn)行。例如圖像處理
    的頭像 發(fā)表于 04-01 22:25 ?869次閱讀
    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫<b class='flag-5'>多線程</b>CPU密集型任務(wù)TaskPool】

    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫多線程I/O密集型任務(wù)開發(fā)】

    使用異步并發(fā)可以解決單次I/O任務(wù)阻塞的問題,但是如果遇到I/O密集型任務(wù),同樣會(huì)阻塞線程中其它任務(wù)的執(zhí)行,這時(shí)需要使用多線程并發(fā)能力來進(jìn)行解決。 I/O密集型任務(wù)的性能重點(diǎn)通常不在于CPU
    的頭像 發(fā)表于 04-01 16:32 ?540次閱讀
    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫<b class='flag-5'>多線程</b>I/O密集型任務(wù)開發(fā)】

    鴻蒙APP開發(fā):【ArkTS類庫多線程】TaskPool和Worker的對(duì)比

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)。可以有效地避免這些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗,并提高系統(tǒng)的整體性能。
    的頭像 發(fā)表于 03-26 22:09 ?683次閱讀
    鴻蒙APP開發(fā):【ArkTS類庫<b class='flag-5'>多線程</b>】TaskPool和Worker的對(duì)比

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程TaskPool和Worker的對(duì)比(一)

    TaskPool(任務(wù)池)和Worker的作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,用于處理耗時(shí)的計(jì)算任務(wù)或其他密集型任務(wù)。可以有效地避免這些任務(wù)阻塞主線程,從而最大化系統(tǒng)的利用率,降低整體資源消耗
    發(fā)表于 03-25 14:11

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫多線程I/O密集型任務(wù)開發(fā)

    使用異步并發(fā)可以解決單次I/O任務(wù)阻塞的問題,但是如果遇到I/O密集型任務(wù),同樣會(huì)阻塞線程中其它任務(wù)的執(zhí)行,這時(shí)需要使用多線程并發(fā)能力來進(jìn)行解決。 I/O密集型任務(wù)的性能重點(diǎn)通常不在于CPU的處理
    發(fā)表于 03-21 14:57

    java實(shí)現(xiàn)多線程的幾種方式

    Java實(shí)現(xiàn)多線程的幾種方式 多線程是指程序中包含了兩個(gè)或以上的線程,每個(gè)線程都可以并行執(zhí)行不同的任務(wù)或操作。Java中的多線程可以提高程序
    的頭像 發(fā)表于 03-14 16:55 ?765次閱讀

    AT socket可以多線程調(diào)用嗎?

    請(qǐng)問AT socket 可以多線程調(diào)用嗎? 有互鎖機(jī)制嗎,還是要自己做互鎖。
    發(fā)表于 03-01 08:22

    什么是多核多線程?多核多線程如何提高程序的運(yùn)行效率?

    線程無法充分利用多核處理器的并行計(jì)算能力。
    的頭像 發(fā)表于 02-20 10:22 ?1433次閱讀

    linux多線程編程實(shí)例

    linux線程
    的頭像 發(fā)表于 02-15 21:16 ?497次閱讀
    linux<b class='flag-5'>多線程</b>編程實(shí)例
    主站蜘蛛池模板: 热re久久精品国产99热| 欧洲精品不卡1卡2卡三卡| 就去色播| 久久精品国产精品亚洲红杏| 久热福利| 欧美亚洲啪啪| 视频二区中文字幕| 久久青草视频| 四虎影视4hu4虎成人| 午夜乩伦| 欧美日本一区| 九九九精品午夜在线观看| 一级片视频播放| 色偷偷88欧美精品久久久| 欧美精品videosex极品| 激情婷婷网| 91p0rn永久备用地址二| 天天操天天插| 亚洲综合在线最大成人| 日韩一卡2卡三卡4卡无卡网站| 一级特黄国产高清毛片97看片| 色噜噜狠狠成人中文小说| 我要看一级大片| 欧美作爱福利免费观看视频| 黄网站在线播放| 午夜神马福利影院| 伊人成年综合网| 欧美一级片免费观看| 男人和女人在床做黄的网站| 欧美性受xxxx| 国产美女一级视频| 日本中文在线三级在线播放| 特级一级毛片| 免费的色网站| 一级特黄a视频| 国产激情久久久久影院小草| 黄网站色| 欧美区亚洲区| 色播五月婷婷| 成人在线看片| 国产亚洲精品aa在线看|