为什么线程没有切换?

时间:2013-12-12 18:08:24

标签: java multithreading

我想以随机顺序从其他文件中获取一个包含其他文件的文件。我必须用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();
    }
}

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

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

1 个答案:

答案 0 :(得分:1)

  

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

您的问题是所有线程都附加到同一文件但使用不同的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的{​​{1}}。