单线程,多线程,线程池方法大文件指定单词数量统计
来源:互联网 发布:拉尼娅王后知乎 编辑:程序博客网 时间:2024/06/06 04:09
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class test { private static BufferedReader reader; private static int Count = 0; private static int threadNum; private static String word; private static String way; private static long beginTime; private static long endTime; private static final int Single = 0; private static final int Multi = 1; private static final int Pool = 2; private static final int Failed = 3; @Override protected void finalize() throws Throwable { super.finalize(); } public static void main(String[] args) { beginTime=System.currentTimeMillis(); try { File file = new File("test.txt"); reader = new BufferedReader(new FileReader(file)); } catch (Exception e) { e.printStackTrace(); } if (judgeThread(args) == Single) { if (args.length == 3) { word = args[2]; } else { word = args[4]; } threadNum = 1; search(); print(); } else if (judgeThread(args) == Multi) { word = args[4]; threadNum = Integer.valueOf(args[3]); multiSearch(); } else if (judgeThread(args) == Pool) { word = args[4]; threadNum = Integer.valueOf(args[3]); poolSearch(); } else { System.out.println("Error Input!"); } } private static void search() { try { String line; while ((line = reader.readLine()) != null) { String content[] = line.split(" "); for (int i=1;i<content.length;i++) { if (content[i].equals(word)) { Count++; } } } } catch (Exception e) { e.printStackTrace(); } } private static int judgeThread(String[] args) { if ((args.length == 3 && args[0].equals("-t") && args[1].equals("Single")) || args.length == 5 && args[0].equals("-t") && args[1].equals("Single") && args[2].equals("-n")) { way=args[1]; return Single; } else if (args.length == 5 && args[0].equals("-t") && args[1].equals("Multi") && args[2].equals("-n")) { way=args[1]; return Multi; } else if (args.length == 5 && args[0].equals("-t") && args[1].equals("Pool") && args[2].equals("-n")) { way=args[1]; return Pool; } return Failed; } private static void multiSearch() { CountDownLatch countDownLatch = new CountDownLatch(threadNum); Lock lock = new ReentrantLock(); for (int i = 0; i < threadNum; i++) { new Thread(new Runnable() { @Override public void run() { lock.lock(); search(); countDownLatch.countDown(); lock.unlock(); } }).start(); } try { countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } print(); } private static void poolSearch() { ExecutorService pool= Executors.newCachedThreadPool(); Lock lock=new ReentrantLock(); for(int i=0;i<threadNum;i++) { pool.execute(new Runnable() { @Override public void run() { lock.lock(); search(); lock.unlock(); } }); } pool.shutdown(); try { while(!pool.awaitTermination(1, TimeUnit.SECONDS)); } catch (Exception e) { e.printStackTrace(); } print(); } private static void print() { endTime=System.currentTimeMillis(); System.out.println("单词"+word+"共有"+Count+"个"); System.out.println("运行方式为:"+way); System.out.println("线程数为:"+threadNum+"共耗时"+(double)(endTime-beginTime)/1000+"s"); }}
阅读全文
0 0
- 单线程,多线程,线程池方法大文件指定单词数量统计
- Java多线程查找指定文件夹下包含指定关键字的文件数量(线程池版)
- 大文件上传-单线程与多线程
- Java多线程查找指定文件夹下包含指定关键字的文件数量(未使用线程池版)
- 多线程之计算文件单词数量-线程参数-互斥锁访问共享区
- Servlet 3.0 新特性详解(servlet是单实例多线程的,线程池数量有限)
- Java+统计文件文章中单词的数量,去除指定特殊符号
- 多线程复制文件比单线程慢?
- 单线程与多线程读取文件
- 【Java】统计文件中各单词数量
- Python多线程与单线程处理大文件的性能差异【附图】
- 多线程,单线程
- 单线程 多线程
- 单线程,多线程
- 单线程和多线程
- 单线程和多线程
- 单线程与多线程
- 单线程与多线程
- ConfigReader(五十九)—— RuneConfig
- jqueryrotate--jQuery旋转插件
- 实验二 Linux用户管理
- 高二&高一&初三模拟赛27 总结
- ORA-01541: system tablespace cannot be brought offline; shut down if necessary
- 单线程,多线程,线程池方法大文件指定单词数量统计
- 数据库基本命令
- Android LockSupport 分析
- BZOJ 1051 [HAOI2006]受欢迎的牛
- K-means++算法思想
- TP5上传图片Call to a member function move() on null
- GoldenGate(4)_问题答疑与部署中的错误记录
- SSL2776 2017年10月19日提高组 整除(容斥+dfs)
- C++实现string类