测试:
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);
}
}
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);
}
}
第二个线程连续输出
Thread[Thread-1,5,main]11
Thread[Thread-1,5,main]12
Thread[Thread-1,5,main]13
这时又跳回到第一个线程,输出
Thread[Thread-0,5,main]10
每次都是buff.write(str);写进去的,i都是不同的,依次递增。
每执行一次buff.write(str); i肯定都会自增1次,所以写入文件的内容,i是依次增加的。buff.write(str);
System.out.println("str is " + str);这两句会有不同的输出结果,原因就是这两句可能由二个不同的线程分别执行。楼主体会一下吧。
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>
写入到文件只是控制台输出的一半.
两个线程是并发的,这两个排列的顺序是随机的,所以有时一个在前,一个在后。但是,你输出到文件的时候,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
文件中就保留一种
buff = new BufferedWriter(new FileWriter("d:\\logm1.txt", true));
只发现一个小问题,就一个不见了,后面出了一个乱码。