假设有一个计算量非常大的任务,使用单线程处理会花费很长时间才能处理完成,这时候可以考虑使用多线程分批计算数据,然后再汇总数据输出。在这里,使用了CyclicBarrier来实现。这个类的功能就是指定特定的线程数,等到这些线程都执行完毕之后,才会执行它的await()方法后面的代码,如果在构造器里设定了一个线程类,那么会在业务线程执行完毕之后,先执行构造器里的线程,然后执行await方法后面的线程。

package test;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.Callable;

import java.util.concurrent.CyclicBarrier;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class Test1 {

private static ExecutorService service = Executors.newFixedThreadPool(4);

public static void main(String[] args) {

final Map map = new HashMap(4);

CyclicBarrier cb = new CyclicBarrier(4, new Runnable(){

public void run() {

Integer count1 = map.get("1");

Integer count2 = map.get("2");

Integer count3 = map.get("3");

Integer count4 = map.get("4");

System.out.println("count= " + (count1 + count2 + count3 + count4));

}

});

new Thread(new TestThread(map, "1", cb,1000)).start();

new Thread(new TestThread(map, "2", cb,1000)).start();

new Thread(new TestThread(map, "3", cb,1000)).start();

new Thread(new TestThread(map, "4", cb,1000)).start();

//线程池实现方式

int sum = 0;

for(int i = 0; i < 4; i++) {

Future data = service.submit(new Callable(){

@Override

public Integer call() throws Exception {

int sum = 0;

for(int i = 0; i < 1000; i++) {

sum += i;

}

return sum;

}

});

try {

sum += data.get().intValue();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("count===" + sum);

}

}

class TestThread implements Runnable {

private Map map;

private String type;

private CyclicBarrier cb;

private int n;

public TestThread(Map map, String type, CyclicBarrier cb, int n) {

this.map = map;

this.type =type;

this.cb = cb;

this.n = n;

}

@Override

public void run() {

int sum = 0;

for(int i = 0; i < n; i++) {

sum += i;

}

map.put(type, sum);

try {

cb.await();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (BrokenBarrierException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

java 多线程合并结果集_多线程计算数据,然后合并数据相关推荐

  1. java 监控对象是什么_多线程-Java中的对象监视器是什么意思? 为什么要使用这个词?...

    多线程-Java中的对象监视器是什么意思? 为什么要使用这个词? 在阅读有关Java线程的文章时,我经常注意到这样的表达:"当前线程是该对象的监视器的所有者". 我的意思是:线程有 ...

  2. svn合并不同树_如何利用SVN合并代码

    展开全部 利用SVN合并 Subversion的版本库是一种文件服务器,但不是"一般"的文件服务器.e69da5e6ba9062616964757a686964616f313333 ...

  3. java 多线程合并结果集_java多线程-合并

    java多线程-合并 线程合并的意义就是几个并行的线程合并为一个单线程执行,应用于一个线程必须等待另个线程执行完毕后执行 例题:现有一个主线程,T1,T2怎么让T2在T1之后执行,主线程在T2之后执行 ...

  4. java 扫描tcp端口号_多线程TCP端口扫描 java实现

    界面部分: import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt. ...

  5. java线程的创建线程_多线程(Thread、线程创建、线程池)

    第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...

  6. java线程 cpu占用率_多线程程序 怎样查看每个线程的cpu占用

    可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的 ...

  7. java多线程的底层实现_多线程的底层实现机制 - 欢迎来到古怪匹诺曹的开发世界 - OSCHINA - 中文开源技术交流社区...

    1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开启多条线程, ...

  8. java 线程访问控件_多线程下访问控件的方式

    前言 在很多情况下,我们都会使用到多线程,在使用多线程的时候,我们很多时候又会去访问控件,这里面就会出现很多问题!!!我以一个最常见的,我们经常会用到的例子来讲讲,在提高自己水平的同时,希望能给大家带 ...

  9. java 线程间变量共享_多线程:(五)多个线程之间共享数据

    简单的总结一下多线程共享数据的方式.其实,最重要的,是一个思想,一个面向对象的编程思想的建立. 说两点: 一.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中 ...

最新文章

  1. 【数学和算法】初识卡尔曼滤波器(三)
  2. SpringSecurity - 基础篇
  3. windows系统内实现端口转发
  4. python os.walk_Python os.walk() 简介
  5. Matconvnet 学习笔记
  6. Unity Text 插入超链接
  7. 笔记15(Linux监控平台)
  8. 图像目标检测识别,计算物体个数,针对电子元器件计算
  9. C语言——知识点汇总
  10. 初等函数导数公式 ,积分表
  11. adobe flash player android 4.4,adobe flash player最新版
  12. 实数系的基本定理_初中数学:重点公式定理集合,中学生应该看一看
  13. HDU 1275 两车追及或相遇问题(相遇和追及公式)
  14. c# sqlite 批量修改
  15. Art Blocks:生成艺术的自动售货机
  16. spooling技术和通道及实现打印机共享
  17. [c语言]0xC0000005访问冲突
  18. 三年级计算机画图工具教案,小学三年级信息技术教学设计《画图》
  19. mysql中group by用法解析
  20. PESD5V0F1BSF特性好处

热门文章

  1. nodejs入门_如何在NodeJS中使用套接字创建专业的Chat API解决方案[入门级]
  2. 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
  3. 学习Node.js并开始在浏览器之外执行JavaScript
  4. 项目使用ts辅助_启动辅助项目后的前100天该做什么
  5. os系统好用的学术笔记软件_可靠软件系统的设计方法:学术文章摘要
  6. ds--8600使用手册_我如何用57行代码复制一个价值8600万美元的项目
  7. 101_Power Pivot DAX 累计至今,历史累计至今
  8. 基于分位数回归的静态CoVaR计算 案例与代码
  9. Stateflow中的真值表注意事项
  10. 原来python中实现语音识别如此简单!