0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

List集合:多线程快速处理

Android编程精选 来源:CSDN 作者:CSDN 2022-06-02 11:24 次阅读

有一个大List集合,遍历进行一些耗时操作,不能达到性能要求,查询日志,单个任务虽然有不少数据库和第三方API请求,比较耗时,但返回效率尚可,所以优先采用多线程方式进行处理并行请求数据库和第三方API,因为处理完还要对list所属的数据进行操作,所以,线程池多线程处理要等待全部处理完。

相关的代码如下:

@Test
publicvoidtestTB()
{
List< String >list=newArrayList< >();
for(inti=0;i< 900;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;j< batch; j++)
    {
      intend=(j+1)*100;
if(end>size)
{
end=size;
}
List< String >subList=list.subList(j*100,end);
touchWorker.execute(()->sleepTest(subList));
}
touchWorker.shutdown();
while(true)
{
if(touchWorker.isTerminated())
{
break;
}
}
}
else
{
sleepTest(list);
}
}
privatevoidsleepTest(List< String >subList)
{
for(Stringi:subList)
{
try
{
//耗时操作
System.out.println("######"+i+"######"+Thread.currentThread().getName());
//Thread.sleep(1000*30);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
}
void shutdown()

启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。

抛出:SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess 方法拒绝访问。

boolean isTerminated()

若关闭后所有任务都已完成,则返回true。注意除非首先调用shutdownshutdownNow,否则isTerminated永不为true。返回:若关闭后所有任务都已完成,则返回true。

当然还有一种方法,是之前写的,方法比上边的臃肿了,不过会获取返回结果进行处理:逻辑是获取所有页面的List,多线程遍历List后,将所有页面的违规词查出发送邮件,代码:

/**
*落地页违规词排查(多线程)。
*@return
*/
@Test
publicvoidgetViolationsLandpageByThreadPool(){
try{
landPageService.getViolationsLandpageByThreadPool("1年");
}catch(Exceptione){
e.printStackTrace();
}
}

//开始时间
longstart=System.currentTimeMillis();
/*Listlist=newArrayList();
for(inti=1;i<= 3000; i++) {
    list.add(i + "");
}*/

Listlist=landPageDao.getPageIdAndPath();
//初始化敏感词库对象
SensitiveWordInitsensitiveWordInit=newSensitiveWordInit();
//从数据库中获取敏感词对象集合(目前先放在资源文件中,等以后比较多或者需要界面操作时再用数据库)
//构建敏感词库
MapsensitiveWordMap=sensitiveWordInit.initKeyWord(vioKey);
//传入SensitivewordEngine类中的敏感词库
SensitivewordEngine.sensitiveWordMap=sensitiveWordMap;
//每500条数据开启一条线程
intthreadSize=11000;
//总数据条数
intdataSize=list.size();
//线程数
intthreadNum=dataSize/threadSize+1;
//定义标记,过滤threadNum为整数
booleanspecial=dataSize%threadSize==0;

/*list.parallelStream().forEach(url->{});*/
//创建一个线程池
ExecutorServiceexec=Executors.newFixedThreadPool(threadNum);
//定义一个任务集合
List>>tasks=newArrayList>>();
Callable>task=null;
ListcutList=null;

//确定每条线程的数据
for(inti=0;i< threadNum; i++) {
    if(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)){
//调用第一个方法,获取html字符串
Stringhtml=httpRequest(path);
//调用第二个方法,获取包含的违规词
if(StringUtils.isNotBlank(html)){
html=html.replaceAll("","");
//Stringbuffer=htmlFiter2(html);
SetbufferSet=SensitivewordEngine.getSensitiveWord(html,1);//得到敏感词有哪些,传入2表示获取所有敏感词//sensitiveWordFiltering(html);
/*String[]word={"备案","错过将延误","仅需1980元"};
for(inti=0;i
String[]word={
"一年","1年学完","一年学完","1年内学完","一年内学完"
};
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;
}
};
//这里提交的任务容器列表和返回的Future列表存在顺序对应的关系
tasks.add(task);
}

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

//关闭线程池
exec.shutdown();
System.out.println("线程任务执行结束");
System.err.println("执行任务消耗了:"+(System.currentTimeMillis()-start)+"毫秒");

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

result就是需要发送邮件的相关结果了

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 多线程
    +关注

    关注

    0

    文章

    275

    浏览量

    19850
  • 代码
    +关注

    关注

    30

    文章

    4671

    浏览量

    67764

原文标题:多线程快速处理 List 集合,你学会了吗?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 179次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一个远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了个小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序
    的头像 发表于 03-14 16:55 433次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    redis多线程还能保证线程安全吗

    Redis是一种使用C语言编写的高性能键值存储系统,它是单线程的,因为使用了多路复用的方式来处理并发请求。这样的实现方式带来了很好的性能,但同时也引发了一些线程安全方面的问题。 在Redis中,由于
    的头像 发表于 12-05 10:28 1346次阅读

    redis使用多线程处理操作命令

    Redis 是一个使用多线程处理操作命令的开源内存数据库系统。它以其高性能、可扩展性和灵活性而闻名,通常被用作缓存、消息代理和数据存储等各种应用场景。在本文中,我们将详尽、详实、细致地探
    的头像 发表于 12-05 10:25 461次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 1143次阅读

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份数据。由于多线程并发执行的特点,会引发数据同步的问题,即保证多个
    的头像 发表于 11-17 14:22 890次阅读

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的访问。下面将介绍几种常见的
    的头像 发表于 11-17 14:16 958次阅读

    Linux系统上多线程和多进程的运行效率

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你
    的头像 发表于 11-10 10:54 1059次阅读
    Linux系统上<b class='flag-5'>多线程</b>和多进程的运行效率

    基于DSP/BIOS多线程的小型组合导航系统设计

    电子发烧友网站提供《基于DSP/BIOS多线程的小型组合导航系统设计.pdf》资料免费下载
    发表于 11-08 10:07 0次下载
    基于DSP/BIOS<b class='flag-5'>多线程</b>的小型组合导航系统设计

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。
    的头像 发表于 11-06 14:46 687次阅读
    关于Python多进程和<b class='flag-5'>多线程</b>详解

    多线程idm下载软件

    多线程idm下载软件
    发表于 10-23 09:23 0次下载

    MDK可以支持多线程编译吗?

    怎么才能打开多线程编译
    发表于 10-11 07:23

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 843次阅读