日期:2014-05-20  浏览次数:20746 次

请帮忙看一下为什么下面的代码写入文件的内容与屏幕输出的不一样?
测试:
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);
发现题目所描述的问题。
代码如下:
Java code

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



------解决方案--------------------
写入到文件的不受影响。
每次都是buff.write(str);写进去的,i都是不同的,依次递增。
------解决方案--------------------
我觉得应该是那个文件被一个线程占用的时候,另外一个线程就写不进去,要等这个线程执行完后,另外一个线程才能写进去,
------解决方案--------------------
有两个线程:一个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
文件中就保留一种