对于必须在for循环内进行查询的场景,可采用以下几种方式进行优化。

1、主线程与子线程无先后顺序

    public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 5; i++) {
ThreadUtil.execAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "执行完");
});
System.out.println("第" + i + "个线程");
}
System.out.println("完成");
}

执行结果:

2、主线程在所有子线程执行完成之后执行

    public static void main(String[] args) throws InterruptedException {
//初始化线程数量
CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(5);
for (int i = 0; i < 5; i++) {
ThreadUtil.execute(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "执行完");
//调用线程计数器-1
countDownLatch.countDown();
});
System.out.println("第" + i + "个线程");
}
//唤醒主线程
countDownLatch.await();
System.out.println("完成");
}

执行结果:

3、主线程在所有子线程执行完成之后执行

 public static void main(String[] args) throws InterruptedException {

        // 线程个数
int N = 10;
// 实例化一个倒计数器,N指定计数个数
CountDownLatch countDownLatch = new CountDownLatch(N);
for (int i = 0; i < N; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("子线程" + Thread.currentThread().getName() + "休眠结束");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 计数减一
countDownLatch.countDown();
}
}
}).start();
}
// 阻塞,等待当计数减到0时,执行后面的代码
countDownLatch.await();
System.out.println("结束");
}

执行结果:

4、示例Demo

JAVA多线程10个线程处理1000个数据

    public static void main(String[] args) throws Exception {
List<Integer> idList = new ArrayList<>();
for (int i = 1; i <= 1000; i++) {
idList.add(i);
} int threadNum = 10;
ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
CountDownLatch countDownLatch = new CountDownLatch(threadNum); int perSize = idList.size() / threadNum;
// 定义接受数据集合 多线程情况下,使用线程安全集合
List<Integer> resultList = Collections.synchronizedList(new ArrayList()); for (int i = 0; i < threadNum; i++) {
MultiThread thread = new MultiThread();
thread.setIdList(idList.subList(i * perSize, (i + 1) * perSize));
thread.setCountDownLatch(countDownLatch);
thread.setResultList(resultList);
executorService.submit(thread);
}
countDownLatch.await();
executorService.shutdown(); // 查看结果
System.out.println(resultList.size());
System.out.println(resultList.stream().sorted().collect(Collectors.toList()));
}
} class MultiThread extends Thread {
private List<Integer> idList; private CountDownLatch countDownLatch; private List<Integer> result; public void setResultList(List<Integer> result) {
this.result = result;
} public void setIdList(List<Integer> idList) {
this.idList = idList;
} public void setCountDownLatch(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
} @Override
public void run() {
try { // 数据处理
for (Integer integer : idList) {
if (integer % 2 == 0) {
result.add(integer);
}
} } catch (Exception e) {
e.printStackTrace();
} finally {
if (countDownLatch != null) {
countDownLatch.countDown();
}
}
}

执行结果:

Java 多线程处理 for 循环数据的更多相关文章

  1. java基础3_循环语句,数组

    java中的循环: Java中提供了3中循环结构:  while  do-while  for ① 循环结构的作用? 可以不断重复执行循环结构中的代码: ② 上面的3个循环结构功能都是一样的,只是结构 ...

  2. java中for循环的6种写法

    有些写法上的说明写的过于武断,可能有很多不当之处,仅供参考.   package ForLoop; import java.util.ArrayList; import java.util.Itera ...

  3. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  4. Java虚拟机运行时数据区

    运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...

  5. java读取PHP接口数据的实现方法(四)

    PHP文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3 ...

  6. Java问题记录——循环里的二次判断与状态更新

    Java问题记录——循环里的二次判断与状态更新 摘要:本文主要记录了在循环操作时可能出现的问题. 问题重现 在使用循环结构时,如果使用了定时任务,或者代码会多次调用循环结构,可能会导致有些对象会被循环 ...

  7. Java (新)将Excel数据读取到ListMap

    Java (新)将Excel数据读取到ListMap Maven依赖: pom.xml <!-- excel --> <dependency> <groupId>o ...

  8. Java在处理大数据的时候一些小技巧

    Java在处理大数据的时候一些小技巧 发布时间:2013-05-09 00:00:00 来源:中国IT实验室 作者:佚名   关键字:Java 众所周知,java在处理数据量比较大的时候,加载到内存必 ...

  9. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

  10. Android java传递int类型数据给C

    本文根据<Android jni简便开发流程>中的开发流程来实现一个java传递int类型数据给C 新建项目,进行简单的布局 <LinearLayout xmlns:android= ...

随机推荐

  1. Django中render()函数和redirect()函数

    render() 作用:render是渲染变量(结合一个给定的模板和一个给定的上下文字典)在模板中,通俗点将context的内容,加载进模板中定义的文件,通过浏览器渲染呈现. render()方法常用 ...

  2. django model字段类型

    1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=True)2.mod ...

  3. C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)

    信创是现阶段国家发展的重要战略之一,面对这一趋势,所有的软件应用只有支持信创国产化的基础软硬件设施,在未来才不会被淘汰.那么,如何可以使用C#来实现支持信创环境的视频会议系统吗?答案是肯定的. 本文讲 ...

  4. Python爬取微信小程序实战(通用)

    背景介绍 最近遇到一个需求,大致就是要获取某个小程序上的数据.心想小程序本质上就是移动端加壳的浏览器,所以想到用Python去获取数据.在网上学习了一下如何实现后,记录一下我的实现过程以及所踩过的小坑 ...

  5. web自动化03-xpath定位

      目标: Xpath方法   1.定位一组元素的方法   element = driver.find_elements_by_*("*")      * 可以是name,tag_ ...

  6. 二进制部署k8s集群

    部署k8s有多种方式,本章我们采取二进制的部署方式来部署k8s集群,二进制部署麻烦点,但是可以在我们通过部署各个组件的时候,也通知能让我们更好的深入了解组件之间的关联,也利于后期维护 主机环境 系统: ...

  7. GPT虚拟直播Demo系列(二)|无人直播间实现虚拟人回复粉丝

    摘要 虚拟人和数字人是人工智能技术在现实生活中的具体应用,它们可以为人们的生活和工作带来便利和创新.在直播间场景里,虚拟人和数字人可用于直播主播.智能客服.营销推广等.接入GPT的虚拟人像是加了超强b ...

  8. qq飞车端游最全按键指法教学

    目录 起步篇 超级起步 弹射起步 段位起步 基础篇 点飘 撞墙漂移 撞墙点喷 进阶篇 双喷 叠喷 断位漂移 段位双喷 侧身漂移 快速出弯 CW WCW CWW 牵引 甩尾点飘 甩尾漂移 右侧卡 左侧卡 ...

  9. Scalpel:解构API复杂参数Fuzz的「手术刀」

    Scalpel简介 Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点 ...

  10. @FunctionalInterface注解的使用

    被@FunctionalInterface注解标记的类型表明这是一个函数接口.从概念上讲,函数接口只有一个抽象方法.如果接口声明的抽象方法覆写Object类的公共方法,那这方法不算作接口的抽象方法,因 ...