博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程分批处理集合中的元素【我】
阅读量:5216 次
发布时间:2019-06-14

本文共 4720 字,大约阅读时间需要 15 分钟。

 

 

package cn.nest;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class MySemaphore2 {    //统计实际一共处理了多少个数据    static int sum = 0;        public static void main(String[] args) throws IOException, InterruptedException {                //待处理集合        ArrayList
list = new ArrayList<>(); //定义待处理集合中元素数量 int dataSize = 35; //拼装数据 for (int i = 0; i < dataSize; i++) { list.add(i); } //打印集合原始数据和长度 System.out.println("list: "+list); System.out.println("list size: "+list.size()); //定义多线程 final Semaphore semaphore = new Semaphore(5); ExecutorService exec = Executors.newCachedThreadPool(); //记录开始时间 final long start = System.currentTimeMillis(); //定义一次执行多少个数据 int onceNum = 10; //计算需要执行多少次 int executeNum = (int) Math.ceil(dataSize / onceNum +1); System.out.println("num: "+executeNum); for (int i = 0; i < executeNum; i++) { //为了在run方法中使用变量i的值,需要在这里重新定义 Integer n = i; //定义线程任务 Runnable task = new Runnable() { @Override public void run() { try { semaphore.acquire();//获取信号量 // System.out.println(1000*i+"~"+(1000*i+1000)); //遍历,计算当前需要处理的这批数据的角标 for (int j = onceNum*n; j < (onceNum*n+onceNum); j++) { //当前处理的数据 System.out.println(Thread.currentThread().getName()+" --: "+list.get(j)); sum++; } //开始休息 System.out.println(Thread.currentThread().getName()+" 休息一分钟"); Thread.sleep(1000*60); semaphore.release();//释放信号量 } catch (InterruptedException e) { e.printStackTrace(); } } }; //提交任务(开启线程) exec.submit(task); } exec.shutdown(); //判断所有线程都结束// exec.awaitTermination(1, TimeUnit.HOURS); //用这个也行 while (true) { if (exec.isTerminated()) { System.out.println("-----------------所有的子线程都结束了!"); break; } Thread.sleep(1000); } //后续逻辑 final long end = System.currentTimeMillis(); System.out.println("consumer time : "+(end-start));//耗时 System.out.println("sum: "+sum);//一共处理了多少条数据 } public static void main1(String[] args) throws IOException, InterruptedException { final File stream = new File("c:\\temp\\stonefeng\\stream.txt"); final OutputStream os = new FileOutputStream(stream); final OutputStreamWriter writer = new OutputStreamWriter(os); final Semaphore semaphore = new Semaphore(10); ExecutorService exec = Executors.newCachedThreadPool(); final long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { final int num = i; Runnable task = new Runnable() { @Override public void run() { try { semaphore.acquire(); writer.write(String.valueOf(num)+"\n"); semaphore.release(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }; exec.submit(task); } exec.shutdown(); exec.awaitTermination(1, TimeUnit.HOURS); writer.write("---END---\n"); writer.close(); System.out.println("ËùÓеÄ×ÓÏ̶߳¼½áÊøÁË£¡"); final long end = System.currentTimeMillis(); System.out.println(end-start); } public static void main2(String[] args) { int size = 1000; int num = (int) Math.ceil(3500 / size +1); System.out.println("num: "+num); for (int i = 0; i < num; i++) { System.out.println(1000*i+"~"+(1000*i+1000)); } }}

 

转载于:https://www.cnblogs.com/libin6505/p/10649100.html

你可能感兴趣的文章
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
【redis4 】
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>
疯狂JAVA16课之对象与内存控制
查看>>