Java并发编程初探
package test; import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; public class Test {
public static void getJavaFile(String currentpath,List<File> files){
File dir = new File(currentpath);
if(dir.exists()){
File temp[] = dir.listFiles();
if(temp != null)
{
for (File b: temp) {
if (b.isFile() && b.toString().endsWith(".java")) {
files.add(b);
}
else if(b.isDirectory()){
getJavaFile(b.toString(), files);
}
}
}
}
}
public final static float percent = (float) 0.9;
public final static int poolsize = (int) (Runtime.getRuntime().availableProcessors()/(1-percent));
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//初始化文件集合
String path = "G:"+File.separator+"src";
List<File> fs = new ArrayList<>();
getJavaFile(path, fs); //顺序执行
long start = System.currentTimeMillis();
int total = 0;
for(File s : fs){
int i = getCount(s);
//System.out.println(s.getName()+"长度为:"+i);
total+=i;
}
long end = System.currentTimeMillis();
System.out.println("顺序执行的时间:"+(end-start)+"得出来的结果:"+total); final ExecutorService executorpool = Executors.newFixedThreadPool(poolsize);
final List<Callable<Integer>> partitions = new ArrayList<>();
for(final File f1 : fs){
partitions.add(new Callable<Integer>() { @Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
Integer i = getCount(f1);
//System.out.println(f1.getName()+"长度为:"+i);
return i;
}
});
}
long startbingfa = System.currentTimeMillis();
final List<Future<Integer>> nums = executorpool.invokeAll(partitions,5,TimeUnit.MINUTES);
int totalbingfa = 0;
for(final Future<Integer>i : nums){
totalbingfa = totalbingfa+i.get();
}
executorpool.shutdown();
long endbingfa = System.currentTimeMillis();
System.out.println("并发的时间:"+(endbingfa-startbingfa)+"得出来的结果:"+totalbingfa); } public static int getCount(File f) throws IOException{
int count = 0;
Reader br = new FileReader(f);
//String line = "";
int c;
while ((c = br.read()) != -1) {
if('a' == (char)c){
count++;
}
}
return count;
}
}
上面可以看到,我设置了大量的文件,然后使用并发和顺序执行,执行结果如下:
顺序执行的时间:140得出来的结果:14002
并发的时间:86得出来的结果:14002
可以看到,其实改进并不特别明显,究其原因就是,代码中的任务的IO密集型特征并不明显,但是就这个而言,时间仍然是有所改进的,采用的是线程池方式,首先定义一个任务集合partitions,
final List<Callable<Integer>> partitions = new ArrayList<>();
其中Integer表示的是任务的返回类型
然后给任务集定义任务,比如上面的就是一个读取文件并且返回一个Integer类型的数据.
然后定义任务服务
final ExecutorService executorpool =Executors.newFixedThreadPool(poolsize);
这里设置的是线程池的大小,也就是能够同时运行的任务数.
然后开始执行
final List<Future<Integer>> nums = executorpool.invokeAll(partitions,5,TimeUnit.MINUTES);
这里返回的是任务集合的全体的返回结果,然后我们遍历nums,用get方法去得到单个结果.
最后要关闭线程池
executorpool.shutdown();
线程池的大小并不是设置的越大越好,根据具体的环境而来,
Java并发编程初探的更多相关文章
- java并发编程资料
并发这玩意很有用,把自己在网上看过觉得总结的很好的资料分享出来.猛击下面的地址查看吧 java并发编程:线程池的使用说明 java并发编程系列文章 Java并发性和多线程专题 并发工具类 Java 7 ...
- 【java并发编程艺术学习】(三)第二章 java并发机制的底层实现原理 学习记录(一) volatile
章节介绍 这一章节主要学习java并发机制的底层实现原理.主要学习volatile.synchronized和原子操作的实现原理.Java中的大部分容器和框架都依赖于此. Java代码 ==经过编译= ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
随机推荐
- Enumerators and Enumerable
Next week task is to learn how generic enumeration interface works, try to build a sample and write ...
- Hadoop.2.x_伪分布环境搭建
一. 基本环境搭建 1. 设置主机名.静态IP/DNS.主机映射.windows主机映射(方便ssh访问与IP修改)等 设置主机名: vi /etc/sysconfig/network # 重启系统生 ...
- Tomcat启动脚本catalina.sh
1 - 概述脚本catalina.sh用于启动和关闭tomcat服务器,是最关键的脚本另外的脚本startup.sh和shutdown.sh都是使用不同的参数调用了该脚本该脚本的使用方法如下(引自该脚 ...
- JavaScript 几种简单的table切换
方法一:for循环+if判断当前点击与自定义数组是否匹配 <!DOCTYPE html> <html lang="en"> <head> < ...
- BizTalk开发系列(十七) 信封架构(Envelop)
在BizTalk开过中使用信封架构可以提高BizTalk处理性能.比如在使用SQL Adapter时使用信封选取多条记录在通过管道的XML拆装器时将信封里的XML消息部分拆分为单独的消息,发布到Mes ...
- C语言100道经典算法
经典的100个c算法 C语言的学习要从基础,100个经典的算法真不知道关于语言的应该发在那里,所以就在这里发了,发贴的原因有2个,第一个,这东西非常值得学习,第二个,想..........嘿嘿,大家应 ...
- Java程序设计 实验三
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:李海空 学号:20135329 成绩: 指 ...
- 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 基于php5.6 php.ini详解
PHP中auto_prepend_file与auto_append_file的用法 第一种方法:在所有页面的顶部与底部都加入require语句.例如:?123require('header.php') ...
- Educational Codeforces Round 16 A B C E
做题太久也有点累了..难题不愿做 水题不愿敲..床上一躺一下午..离下一场div2还有点时间 正好有edu的不计分场 就做了一下玩玩了 D是个数学题 F是个AC自动机 都没看明白 留待以后补 A 给出 ...