测试:
http://topic.csdn.net/u/20120803/10/6f16d665-4d2c-4ccb-8d16-74db1f36ed27.html?seed=1303139503&r=79321454#r_79321454
这个帖子发现了上述的问题。
我调试的时候稍微修改了一下,主要是在buff.write(str);后面加了一句:System.out.println("str is  "+str);
发现题目所描述的问题。
代码如下:import java.io.*;
public class ThreadFight0 implements Runnable
{
public void run()
        {
long a = System.currentTimeMillis();
int i = 0;
BufferedWriter buff = null;
try
        {
buff = new BufferedWriter(new FileWriter("d:\\logm2.txt"));
}
        catch (IOException e1) 
{
e1.printStackTrace();
} while (System.currentTimeMillis() - a <= 50) 
{
try 
{
String str = Thread.currentThread().toString() + i++;
buff.write(str);
System.out.println("str is  "+str);
buff.write("\r\n");
buff.flush();
}
        catch (IOException e)
        {
e.printStackTrace();
}
}
try
        {
buff.close();
System.err.println("OVER, and i is " + i);
}
        catch (IOException e)
        {
e.printStackTrace();
}
}
public static void main1(String[] args) 
{
ThreadFight0 fight = new ThreadFight0();
Thread thread = new Thread(fight);
thread.start();
}

public static void main2(String[] args) 
{
ThreadFight0 fight = new ThreadFight0();
ThreadFight0 fight2 = new ThreadFight0();
Thread thread2 = new Thread(fight2);
Thread thread = new Thread(fight);
thread.start();
thread2.start();
} public static void main(String[] args) 
{
                //main1(args);
main2(args);
}
}

解决方案 »

  1.   

    就因为是多线程的关系。String str = Thread.currentThread().toString() + i++;比如第一个线程执行了这行,str = Thread[Thread-0,5,main]10; 然后这时跳到第二个线程,str = Thread[Thread-1,5,main]11。
    第二个线程连续输出
    Thread[Thread-1,5,main]11
    Thread[Thread-1,5,main]12
    Thread[Thread-1,5,main]13
    这时又跳回到第一个线程,输出
    Thread[Thread-0,5,main]10
      

  2.   

    运行一下程序,打开文件:d:\\logm2.txt" 和控制台输出进行比较.
      

  3.   

    但写入到文件的只有一个线程的内容.(要么是Thread-0的,要么是Thread-1的)。
      

  4.   

    写入到文件的不受影响。
    每次都是buff.write(str);写进去的,i都是不同的,依次递增。
      

  5.   

    从控制台输出可看出来,两个线程是交替执行的。
    每执行一次buff.write(str);  i肯定都会自增1次,所以写入文件的内容,i是依次增加的。buff.write(str);
    System.out.println("str is  " + str);这两句会有不同的输出结果,原因就是这两句可能由二个不同的线程分别执行。楼主体会一下吧。
      

  6.   

    谢谢brightyq回答,但我还是不解!
      

  7.   

    文件里面的内容(开始部分).Thread[Thread-0,5,main]0
    Thread[Thread-0,5,main]1
    Thread[Thread-0,5,main]2
    Thread[Thread-0,5,main]3
    Thread[Thread-0,5,main]4
    Thread[Thread-0,5,main]5
    Thread[Thread-0,5,main]6
    Thread[Thread-0,5,main]7
    Thread[Thread-1,5,main]8
    Thread[Thread-1,5,main]9控制台输出:
    str is  Thread[Thread-1,5,main]0
    str is  Thread[Thread-0,5,main]0
    str is  Thread[Thread-1,5,main]1
    str is  Thread[Thread-0,5,main]1
    str is  Thread[Thread-1,5,main]2
    str is  Thread[Thread-0,5,main]2
    str is  Thread[Thread-1,5,main]3
    str is  Thread[Thread-1,5,main]4
    str is  Thread[Thread-0,5,main]3
    str is  Thread[Thread-1,5,main]5
    str is  Thread[Thread-0,5,main]4
    str is  Thread[Thread-1,5,main]6
    str is  Thread[Thread-0,5,main]5
    str is  Thread[Thread-1,5,main]7
    str is  Thread[Thread-0,5,main]6
    str is  Thread[Thread-1,5,main]8
    str is  Thread[Thread-0,5,main]7
    OVER, and i is 8
    str is  Thread[Thread-1,5,main]9
    OVER, and i is 10d:\myjava>
    写入到文件只是控制台输出的一半.
      

  8.   

    有两个线程:一个Thread[Thread-0,5,main] 还一个Thread[Thread-1,5,main]
    两个线程是并发的,这两个排列的顺序是随机的,所以有时一个在前,一个在后。但是,你输出到文件的时候,Thread[Thread-0,5,main]1和Thread[Thread-1,5,main]1
    是一样的,也就是说后者会覆盖前者的内容。
    比如:先输入了Thread[Thread-0,5,main]1
    后输入了Thread[Thread-1,5,main]1
    则Thread[Thread-1,5,main]1覆盖了之前的Thread[Thread-0,5,main]1
    文件中就保留一种
      

  9.   

    同意11楼,就相当于已经有两个写好的文件了,按照顺序先排好序,一个有m条,一个有n条。在文件的x行,两个线程都要写东西。a线程要写 Thread[Thread-0,5,main]x,b线程要写Thread[Thread-1,5,main]x;后写的等待第一个线程写完然后只能把前面写的覆盖掉,因为他已经写锁定的位置,必须写哪里。除非你用的追加模式。这样就不会发生覆盖。
    buff = new BufferedWriter(new FileWriter("d:\\logm1.txt", true));
    只发现一个小问题,就一个不见了,后面出了一个乱码。