Linux环境/home/test/a路径下有20个文本文件命名规则为R0*.824
File[] files = FileUtil.getFileList("/home/test/a", filter);
获得文件列表后,为每一个文件创建一个线层去逐行读取,发现会随机的个别线程会被阻塞住
最开始在run方法中读取文件的位置是这样写的:
BufferedReader br = null;
try{
   br = new BuffererdReader(new FileReader(a));
   while(true){
      String line = br.readline();
      if(line == null) break;
      //to do
   }
}catch(Exception e){}
}finally{
   if(br != null){
    try{
      br.close();
    }catch(IOException e){}
}
通过记录日志发现在readline处会在随机的文件上阻塞,导致文件不能继续读取。
遂采取第二中读取方案
FileInputStream in = null;
try {
   in = new FileInputStream(sf);
   StringBuffer sb = new StringBuffer("");
   while (true) {
      int i = in.read();
      if(i == -1 ) break;
      sb.append((char)i);
      if(i == '\n'){
      //to do
      }
   }
}catch(Exception e){}
}finally{
   if (in != null) {
      try {
in.close();
      } catch (IOException e) {}
   }
}
发现会在in.read()在随机的文件处阻塞。
这个问题困扰了我一个下午,最后只好单线程的循环处理这些文件,虽然文件不多也不大,效率亦能接受,但是实在是费解,各位高手请给小弟说说这是啥问题?

解决方案 »

  1.   

    抱歉我上边写的有些偷懒了,我实现的线程可以保证每个实例之间没有交集。
    而且我发现阻塞不是线程间发生了锁而彼此被锁住了,
    而是发现InputStream在多个线程同时读多个文件的时候出现了阻塞。
      

  2.   

    to frilly
    我对每个File创建的线程单独处理,每个线程中都是创建新的inputstream或者是reader.to java2000_net
    已经读到文件里了,没有文件尾,从打的日志来看从文件第一行就被阻塞了。
      

  3.   

    把Linux环境的句柄数改大些试试看