iteye_17523 2009-08-18 16:34
浏览 192
已采纳

Java多线程处理文件的问题

[code="java"]
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.text.SimpleDateFormat;

public class Main {
public static void main(String[] args) throws Exception{
File file = new File(""/*文件地址*/);
long start = System.currentTimeMillis();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
Map lines = new ConcurrentHashMap();
for(int i = 0; i < 5; i++){/*这里修改线程数*/
Thread t = new Thread(new LineParser(br,lines));
t.start();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
class LineParser implements Runnable{
LineParser(BufferedReader br,Map lines){
this.br = br;
this.lines = lines;
}
public void run(){
try{
String line;
while((line = br.readLine()) != null){
long time = DataParser.parse(line.substring(0,line.indexOf(" ")));
String eventString = line.substring(line.indexOf(" ")+2,line.length());
lines.put(time, eventString);
Timer.tick(System.currentTimeMillis());
}
if(line == null){
SimpleDateFormat sdft = new SimpleDateFormat("HH:mm:ss");
System.out.println(sdft.format(new Date(Timer.cost())));
}
}
catch(Exception e){}
}
BufferedReader br;
Map lines;
}
class Timer{
public synchronized static void tick(long time){
if(time>max)max = time;
if(min == 0||(time<min))min = time;
}
public static long cost(){
System.out.println(min);
System.out.println(max);
return max-min;
}

private static long max = 0;
private static long min = 0;

}
[/code]
我本来想测试一下看多线程处理文件对速度会不会有很大提升,结果做了这个测试,里面的计时方法可能会有一点偏差,但是在测试中引入了资源消耗的问题,当我开一个线程时候,资源占用在25%,开到10,100时候,CPU资源消耗高达80-90%,这样就算能减少处理文件的时间,恐怕也不能在实际中运用,还请有相关经验的朋友能够对这个程序给点建议。先谢过了。

  • 写回答

4条回答 默认 最新

  • wanghaolovezlq 2009-08-19 16:09
    关注

    你这样的所谓多线程处理文件没一点意义

    BufferedReader本身就是个阻塞io,再多的线程也是同步访问它,

    你把它改成nio的非阻塞方式读取文件,

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题