2013-12-12 8 views
0

Я хочу, чтобы файл содержал письмо из других файлов в случайном порядке. Я должен сделать это с помощью Threads. И я не знаю, почему у меня есть содержимое выходного файла из 1 файла, после него содержимое из 2-х файлов и после этого контента из 3-х файлов. У меня есть Main:Почему потоки не переключаются?

public static void main(final String[] args) throws Exception { 
    for(int i=1;i<args.length; i++) { 
     new Thread1(args[i], args[0]).start(); 
    } 
} 

И класс Резьба1:

public class Thread1 extends Thread { 
    String path; 
    FileWriter fw; 
    private String desc; 
    public Thread1(String path, String desc) { 
     super(); 
     this.desc=desc; 
     this.path=path; 
    } 

    @Override 
    public void run() { 
     FileReader f = null; 
     try { 
      f = new FileReader(path); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int c; 
     try { 
      fw = new FileWriter(desc, true); 
      while((c = f.read()) != -1) { 
       fw.write(c); 
      } 
      fw.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Пожалуйста, объясните мне, почему это не работает в пути, что я думаю, что она должна быть работа.

+0

Вы должны «запустить()» поток после его создания. – SJuan76

+0

У меня есть это после создания объекта в первом коде. – user3025978

+0

Какой результат вы получаете? Какой результат вы ожидаете? Можете ли вы предоставить более подробную информацию, чтобы мы могли воспроизвести эту проблему на наших собственных системах? – templatetypedef

ответ

1

Please, explain me, why it don't work in way, what I think it should be work.

Ваша проблема заключается в том, что все ваши добавления нитей в тот же файл, но с использованием различных FileWriter экземпляров. Похоже, это сработает, но все они переписывают друг друга. Когда вы открываете файл для добавления, он открывает его и помещает маркер записи в конец файла. Когда два потока сделают это, они оба будут на одном маркере. Если поток # 1 записывает символ, тогда поток # 2 будет писать символ и перезаписывать первый.

Вы можете использовать один FileWriter и делиться им с каждым из ваших потоков. Затем вы synchronize на нем для целей мьютекса и записываете.

public Thread1(String path, String desc, FileWriter fw) { 
    this.fw = fw; 
    ... 
} 
... 
// when you write to it, you will need to synchronize on the writer 
sychronized (fw) { 
    fw.write(c); 
} 
// don't close it in the threads but close it later after you have joined with 
// the threads 

Другой вариант разделить PrintStream который уже synchronized внутренне.

+0

Привет, спасибо за ответ :) У меня есть то, что вы написали, но оно бросает java.io.IOException: Stream закрыт. Я закрыл его после цикла в Main. Это плохое место? – user3025978

+2

@ user3025978 Перед закрытием потока вам нужно подождать, пока ваши потоки закончатся. –

+0

Да @ user3025978, вам нужно подождать, пока ваши потоки закончатся, прежде чем закрывать его. Вы можете использовать 'thread.join()' для объединения с каждым из потоков по очереди. Возможно, вы захотите изучить классы «ExecutorService». – Gray

Смежные вопросы