我想获取一个文件,其中包含来自其他文件的随机顺序的信函。我必须用线程来做。而且我不知道为什么我要从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();
    }
}


和Thread1类:

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();
        }
    }
}


请解释一下,为什么它不能正常工作,我认为应该起作用。

最佳答案

请解释一下,为什么它不能正常工作,我认为应该起作用。


您的问题是所有线程都将追加到同一文件,但使用不同的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


另一种选择是共享一个内部已为PrintStreamsynchronized

09-18 13:35