Многопоточность и файловый IO
От: ChaM  
Дата: 01.04.10 15:07
Оценка:
Товарищи подскажите можно ли сделать следующее.

есть некий обработчик файла, который читает файл, обрабатывает поочерёдно каждую строку и по каждой строке результат записывает в другой файл.

Можно ли в данном случае ускорить весь процесс если осуществлять запись результатов для каждой строки в другом потоке? (с целью что бы разбор файла не ждал каждый раз записи на диск)

Например если делаю вот так через очередь то получается гораздо медленнее чем если сразу результат в файл записывать


public class TESTTESTParserWithShift {
    
    String _input_file_name="";
    String _ouput_file_name="";

    public TESTTESTParserWithShift(){
         _input_file_name = "qwe";
         _ouput_file_name = "ttt1.tmp";
  
        LoadTest();
    }





    public int LoadTest() throws Exception{
        
          MyWriter myWriter = new MyWriter();
         while( br.readLine()){
                
            Str res = ОбработчикСтроки();
             myWriter.AddStr(cResultPacket.strResult);

          }
         myWriter.Stop();     
         myWriter.t.join();
         bw.close();
         return 1;
    }



    class MyWriter implements Runnable{
        
        Queue<String> queue;
        public Thread t;
        boolean isEnd = false;
        BufferedWriter bw;
          public MyWriter(){              
              try {                  
                bw = new BufferedWriter(new FileWriter(_ouput_file_name));
            } catch (IOException e) {
                LOG.error(e);
            }
            queue = new LinkedList<String>();
              t = new Thread(this,"sdfdsf");
              t.start();          
            
        }
        
          public void AddStr(String str){
              synchronized (queue){
                  queue.add(str);
              }
          }
    
          public void Stop(){
              isEnd = true;
              try {
                bw.close();
            } catch (IOException e) {
                LOG.error(e);
            }
          }
        
        
        @Override
        public void run() {
             String str;
            while(isEnd == false){
                try {
                    synchronized (queue) {
                        while((str=queue.poll())!=null){                    
                            bw.write(str);
                        }
                    }
                } catch (Exception e) {
                    LOG.error(e);
                }
            }
        }
        
    }




}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.