import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; /**
* 多线程 字符流
* @author winkey
*
*/
public class MyThread3 extends Thread{
public static SortArray sortArray = new SortArray(10000) ; public String[] dataArr; public MyThread3(String[] dataArr){
this.dataArr = dataArr;
} public void run(){
//这个地方也有问题,怎么处理临界资源·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//其实我只是想多个线程处理batchDataArr数组
/*for(int i=0;i<batchDataArr.length;i++){
if(this.index<batchDataArr.length){
String str = batchDataArr[index++];
Integer numAsInt = Integer.valueOf(str);
System.out.println(Thread.currentThread().getName()+"__"+numAsInt);
sortArray.setBit(numAsInt, 1);
} */
//while(true){
//String[] batchDataArr = BatchDataArrHolder.take();
//if (null == batchDataArr) continue;
String[] batchDataArr = this.dataArr;
if (null != batchDataArr){
for(int i=0;i<batchDataArr.length;i++){
String str = batchDataArr[i];
Integer numAsInt = Integer.valueOf(str);
System.out.println(Thread.currentThread().getName()+"__"+numAsInt);
sortArray.setBit(numAsInt, 1);
}
}
//}
} public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new FileReader("E:\\bbbbbbb.txt"));
BufferedWriter out = new BufferedWriter(new FileWriter("E:\\cc.txt"));
BatchDataArrHolder holder = new BatchDataArrHolder();
int readLength = 0;
char[] chars = new char[5];
String tail=null;
String batchData; try{
//创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newFixedThreadPool(2);//两个子线程 /*MyThread2 mt2 = new MyThread2();
pool.execute(mt1);
pool.execute(mt2);*/
while(true){
readLength = in.read(chars, 0, chars.length);
//没有读上来数据说明上一次读取数据已读完,不再处理
if(readLength == 0)
break;
boolean isEnd = false;
//读上来的数据少于数组长度,说明这一次已读完,处理完这次后不再继续读取
if(readLength < chars.length){
//System.out.println(String.valueOf(chars).substring(0, readLength));
batchData = String.valueOf(chars).substring(0, readLength);
isEnd = true;
}else{
//System.out.println(String.valueOf(chars));
batchData = String.valueOf(chars);
}
//接上前一次的剩余数据
if(tail != null){
batchData = ""+tail+batchData;
}
//截取本次的剩余数据,留到下次用
tail = batchData.substring(batchData.lastIndexOf(",")+1,batchData.length());
if(tail.length()==0){
tail = null;
}
batchData = batchData.substring(0,batchData.lastIndexOf(","));
String[] batchDataArr = new String[batchData.split(",").length];//多线程处理这个东西!!!
batchDataArr = batchData.split(",");
//holder.push(batchDataArr);//主线程将每次读上来的数据保存到
MyThread3 mt1 = new MyThread3(batchDataArr); pool.execute(mt1);
if(isEnd==true){
break;
}
}
//关闭线程用
pool.shutdown();//只是不能再提交新任务,等待执行的任务不受影响 try {
boolean loop = true;
do { //等待所有任务完成
loop = !pool.awaitTermination(2, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
} while(loop);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*while(true){
if(BatchDataArrHolder.isEmpty()){
pool.shutdown();
break;
}
}*/
//写数据
//Thread.currentThread().sleep(2000);
Integer sortUnit = sortArray.getMaxNum();
System.out.println("最大数为: "+sortUnit);
for(int i = 0;i<=sortUnit;i++){
if(sortArray.getBit(i)==1){
StringBuffer buf = new StringBuffer(""+i+"");
buf.append(",");
Integer num = sortArray.repeatingData.get(i);
if(num!=null && num>=2){
for(int j=2;j<=num;j++){
buf.append(""+i+"").append(",");
}
}
out.write(buf.toString());
}
}
out.flush();
}finally{
if(in!=null){
try{
in.close();
}catch(IOException e){
e.printStackTrace();
}
}
if(out!=null){
try{
out.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}

java线程池的应用浅析的更多相关文章

  1. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  2. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  3. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  4. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  5. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  6. Java线程池的几种实现 及 常见问题讲解

    工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...

  7. Java线程池应用

    Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...

  8. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  9. Java线程池与java.util.concurrent

    Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...

随机推荐

  1. SSH ProxyCommand 实践

    ​ 在阿里上搭了典型的 Nginx + APP server 的架构: 即,只有 Nginx 服务器与公网链接.然后,每次部署升级服务器都要先 SSH 到 Nginx 再 SSH 到 server1 ...

  2. selenium 问题:OSError: [WinError 6] 句柄无效

    问题: 执行多个用例的时候,会抛出异常: File "xxxxxx.py", line 16, in get_driver driver = webdriver.Chrome(ex ...

  3. javascript - 字符串比较

    1. sort是排序根据字符的ASCIll码排序的,不分字符串或其它元素(仅适用于数组) 2. split是将字符串转为数组形式 3. join是将数组转为字符串形式 4. indexOf找到元素后返 ...

  4. 【JavaScript】2013年人气最高的JavaScript框架排名

    本文概述 本文介绍2013年人气急速上升,2014年必须知道的JavaScript框架排名.本文所介绍的排名为Google根据全世界2013年的搜索关键词所做出的统计结果. MVC框架 JavaScr ...

  5. SVN 快速入门!

    输入账户密码即可!

  6. FileUpload类中FileUpload1.FileName和FileUpload1.PostedFile.FileName的区别

    FileUpload1.FileName 用来获取客户端上使用 FileUpload 控件上载的文件的名称.此属性返回的文件名不包含此文件在客户端上的路径.FileUpload1.PostedFile ...

  7. ionic 滚动条问题

    方案一: 设置 ion-content ---> overflow-scroll="false"

  8. sql存储过程等-版本控制

    数据库开发人员总在想,每次修改了函数/存储过程,我们都得自己做备份,用以历史参考,当发现错误的时候,可以回滚 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON ...

  9. 02-maven常用命令,以及使用命令创建目录

    maven常用命令 mvn  -v 查看maven版本 compile 编译 test 测试 package 打包 clean 删除target install  安装jar包到本地仓库中. mave ...

  10. spring AOP编程--AspectJ注解方式

    1. AOP 简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, ...