Java 为什么线程不切换?

Java 为什么线程不切换?,java,multithreading,Java,Multithreading,我想得到一个文件,其中包含一封来自其他文件的随机顺序的信件。我必须用线来做这件事。我不知道为什么我在输出文件中有来自1个文件的内容,之后是来自2个文件的内容,之后是来自3个文件的内容。我主要有: 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个文件的内容,之后是来自2个文件的内容,之后是来自3个文件的内容。我主要有:

public static void main(final String[] args) throws Exception {
    for(int i=1;i<args.length; i++) {
        new Thread1( args[i], args[0]).start();
    }
}
请给我解释一下,为什么它不起作用,我认为它应该起作用

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

您的问题是,所有线程都附加到同一个文件,但使用不同的
FileWriter
实例。这听起来像是可行的,但它们都在互相覆盖。打开要追加的文件时,将打开该文件并将写标记放置在文件末尾。当两个线程执行此操作时,它们将位于同一标记处。如果线程1写入一个字符,那么线程2将写入一个字符并覆盖第一个字符

您可以使用一个
FileWriter
,并与每个线程共享它。然后,出于互斥目的,对其进行
同步
,并执行写入操作

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
,它已经在内部进行了
同步

创建线程后必须
start()
线程。我在第一个代码中创建对象后拥有它。您得到了什么输出?你期望什么样的产出?您能否提供更多详细信息,以便我们可以在自己的系统上复制此问题?例如:我有4个文件。第一个文件是空的。2文件有:abcdef。3档案:ghijkl。4文件:mnoprst。我把它按那个顺序放在输出文件中。我想要随机的。文件中的文本比本例中的长。我期望像gfdsjayfiudsafui:)这样的东西,你有一堆线程都打开同一个文件的不同文件写入程序,并试图同时写入它。这根本不起作用,几乎任何事情都可能发生,这取决于CPU给线程时间的顺序。相反,使用一个所有线程都要写入的同步FileWriter。您好,谢谢您的回复:)我有您编写的,但它会抛出一个java.io.IOException:Stream closed。我在主回路中的for循环后关闭了它。这是一个坏地方?@user3025978您应该等待线程完成后再关闭流。是的@user3025978,您需要等待线程完成后再关闭流。您可以使用
thread.join()
依次连接每个线程。您可能需要查看
ExecutorService
类。如何查看?我写wait()和notify()-但它抛出java.lang.IllegalMonitorStateException。。。当我更改为PrintStream时,我的输出无效-只有一些字母,而不是所有字母。不确定@user3025978。你将不得不做更多的研究,或者就每一个问题问更多的问题。
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