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的弊端执行 ...
随机推荐
- js版根据经纬度计算多边形面积(墨卡托投影)
[摘要:var earthRadiusMeters = 6371000.0; var metersPerDegree = 2.0 * Math.PI * earthRadiusMeters / 360 ...
- android学习的网站收集
1. http://mob.com/#/index 提供分享等统一解决方案 2. http://bbs.apkbus.com/explore/ 这个类似的quroa问答模块,覆盖不错.就是人气,稍差. ...
- DataColumn
DataColumn 是用于创建 DataTable 的列.下面示例使用不同技巧创建.配置一个列,并把它添加到一个 DataTable 中. using System; using System.Da ...
- Xamarin C# Android for Visual Studio 平台安装笔记参考
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mono ...
- Oracle spatial 空间修正函数(SDO_UTIL.RECTIFY_GEOMETRY)
Oracle spatial有个空间修正函数SDO_UTIL.RECTIFY_GEOMETRY,它可以修复以下可能:a.重复节点 b.自相交 c.坐标串朝向不正确. 该函数的构造函数格式: SDO_U ...
- 我的GTD起步
最初因为工作进程漫无目的的逛网页,私人生活也一团乱麻,无法做自己想要的事情,这才开始接触个人管理和时间管理. 慢慢的也开始建立一套自己的体系,但是和之前改变不是很大,后来看了<小强升职记> ...
- css-input与文字的对齐
前言 目前中文网站上面的文字,就我的个人感觉而言,绝大多数网站的主流文字大小为12px,因为在目前高分辨率显示器屏幕下,11px的汉字,其像素点开始不 规整,文字不如12px来的显示良好.12px大小 ...
- Redis总结(三)Redis 的主从复制(转载)
接着上一篇,前面两篇我总结了<Redis总结(一)Redis安装>和<Redis总结(二)C#中如何使用redis> 所以这一篇,会讲讲Redis 的主从复制以及C#中如何调用 ...
- Mosquitto----服务器日志
客户端连接日志 1403334375: New connection from 121.201.8.163 on port 1883. 1403334375: New client connected ...
- C#:数学运算(待补充)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MyCo ...