java线程池的应用浅析
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线程池的应用浅析的更多相关文章
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- Java线程池使用说明
Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...
- (转载)JAVA线程池管理
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- Java线程池的几种实现 及 常见问题讲解
工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...
- Java线程池应用
Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...
- Java线程池的原理及几类线程池的介绍
刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...
- Java线程池与java.util.concurrent
Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...
随机推荐
- tomcat(5)servlet容器
[0]README 0.0)本文部分文字描写叙述转自:"深入剖析tomcat",旨在学习 tomcat(5)servlet容器 的基础知识. 0.1)intro to servle ...
- eclipse 添加 Courier New 字体
下载了eclipse3.7,发现这个版本默认的字体不是Courier New,后来通过eclipse->windows->preferences->general->apper ...
- HTML+CSS-如何定义让两个div横向排列
方法一: 一般情况,默认的div是写一个换一行,那么如何定义两个div横向排列而不换行呢? div默认的display属性是block.所以每一个div都是新的一行,现在把display换成inlin ...
- Sqlserver获取行号
Sqlserver获取行号 select row_number()over(order by userid )as RowNum,*from OUM_User
- C#应用视频教程1.3 Socket通信客户端完善
我们先把前面的代码封装成一个完整的类,因为跟网络相关的方法并不一定是建立socket的服务器和客户端,所以还是应该把两个分开,比如获取本机IP,修改本机IP,PING远程主机这些事情应该放在一个单独的 ...
- 首都医科大学附属北京安贞医院全院级PACS系统采购项目[转]
项目名称:首都医科大学附属北京安贞医院全院级PACS系统采购项目 项目编号:TC140VCF0 采购人名称:首都医科大学附属北京安贞医院 采购人地址:北京市朝阳区安贞里 采购人联系方式:010-644 ...
- 安全的远程登录(SSH)
Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层) ...
- react-router-dom Link search 传参
<Link> 和之前版本没太大区别,重点看下组件属性: to(string/object):要跳转的路径或地址: replace(bool):为 true 时,点击链接后将使用新地址替换掉 ...
- 〖Linux〗不重复启动某应用程序的脚本
cmd="/home/scue/bin/ipclient $ipclient" exist=$(ps aux | grep -v 'grep' | grep "$cmd& ...
- javascript设计模式:构造器模式学习一
javascript 设计模式1.简介javascript是一种弱类型语言,不过类可以通过函数模拟出来最常见的实现方法如下:function Car(model){ this.model = mode ...