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的弊端执行 ...
随机推荐
- [Compose] 9. Delay Evaluation with LazyBox
We rewrite the Box example using lazy evaulation. Here is Box example: const Box = (x) => ({ map: ...
- gedit如何使用代码片段
gedit的片段插件 1 打开这个插件 2 以HTML为例,我们看到触发器是doctype 3则我在编辑一个HTML文档的时候,先输入doctype,再按Tab键,将会自动提示,我选择即可插入 ...
- C 语言-HelloWorld
C 语言-HelloWorld C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言. C 语言是一 ...
- 算法笔记_009:字符串匹配(Java)
1 问题描述 给定一个n个字符组成的串(称为文本),一个m(m <= n)的串(称为模式),从文本中寻找匹配模式的子串. 2 解决方案 2.1 蛮力法 package com.liuzhen.c ...
- ThinkPad如何修改fn键默认操作
ThinkPad如何修改fn键默认操作 ThinkPad笔记本如何修改fn键默认操作 Fn键F1-F12
- GridView的点击事件冲突解决
在开发的时候,常常可能遇到ListView或GridView控件点击事件与Item点击事件冲突的问题.原因是Item布局中的button或ImageButton强制获取了item的焦点,解决方案之中的 ...
- 【Linux】touch命令
用途 touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间. 全称 touch全称即为touch 参数 -a :或--time=atime或--time=access或--time ...
- 基于spring-boot的社区社交微信小程序,适合做脚手架、二次开发
基于spring-boot的社区社交微信小程序,适合做脚手架.二次开发 代码地址如下:http://www.demodashi.com/demo/13867.html 1 概述 笔者做的一个后端基于s ...
- 纯CSS实现蜂窝六边形的个性相册
概述 纯CSS实现蜂窝六边形的个性相册 详细 代码下载:http://www.demodashi.com/demo/12804.html 此案例主要用到CSS3的 transform 和 transi ...
- UML基础——统一建模语言简介
到了21世纪——准确地说是2003年,UML已经获得了业界的认同.在我所见过的专业人员的简历中,75%都声称具备UML的知识.然而,在同绝大多数求职人员面谈之后,可以明显地看出他们并不真正了解UML. ...