请帮忙看一下为什么下面的代码写入文件的内容与屏幕输出的不一样?

nmyangym 2012-08-05 03:23:26
测试:
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);
}
}

...全文
380 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdojqy1122 2012-10-11
  • 打赏
  • 举报
回复
6楼的回答有误,我看错楼了~~
sdojqy1122 2012-10-11
  • 打赏
  • 举报
回复
楼主,3楼是错误的,i明显不是线程同步的,只是个局部变量。
sdojqy1122 2012-10-11
  • 打赏
  • 举报
回复
同意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));
只发现一个小问题,就一个不见了,后面出了一个乱码。

nmyangym 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

有两个线程:一个Thread[Thread-0,5,main] 还一个Thread[Thread-1,5,main]
两个线程是并发的,这两个排列的顺序是随机的,所以有时一个在前,一个在后。

但是,你输出到文件的时候,Thread[Thread-0,5,main]1和Thread[Thread-1,5,main]1
是一样的,也就是说后者会覆盖前者的内容。
比如:先输入了Thread……
[/Quote]

谢谢您的回复,我一时想不明白,再想想!
nmyangym 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

我觉得应该是那个文件被一个线程占用的时候,另外一个线程就写不进去,要等这个线程执行完后,另外一个线程才能写进去,
[/Quote]
谢谢您的回复! 照您说的也应该是两个线程的内容都写到文件里啊! 可没有!
aa7229806 2012-08-06
  • 打赏
  • 举报
回复
有两个线程:一个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
文件中就保留一种


Younfor 2012-08-06
  • 打赏
  • 举报
回复
我觉得应该是那个文件被一个线程占用的时候,另外一个线程就写不进去,要等这个线程执行完后,另外一个线程才能写进去,
Younfor 2012-08-06
  • 打赏
  • 举报
回复
我觉得应该是那个文件被一个线程占用的时候,另外一个线程就写不进去,要等这个线程执行完后,另外一个线程才能写进去,
nmyangym 2012-08-05
  • 打赏
  • 举报
回复
文件里面的内容(开始部分).

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 10

d:\myjava>
写入到文件只是控制台输出的一半.
nmyangym 2012-08-05
  • 打赏
  • 举报
回复
谢谢brightyq回答,但我还是不解!
brightyq 2012-08-05
  • 打赏
  • 举报
回复
从控制台输出可看出来,两个线程是交替执行的。
每执行一次buff.write(str); i肯定都会自增1次,所以写入文件的内容,i是依次增加的。

buff.write(str);
System.out.println("str is " + str);

这两句会有不同的输出结果,原因就是这两句可能由二个不同的线程分别执行。楼主体会一下吧。
brightyq 2012-08-05
  • 打赏
  • 举报
回复
写入到文件的不受影响。
每次都是buff.write(str);写进去的,i都是不同的,依次递增。
nmyangym 2012-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
就因为是多线程的关系。

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……
[/Quote]
但写入到文件的只有一个线程的内容.(要么是Thread-0的,要么是Thread-1的)。
nmyangym 2012-08-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
帮顶,顺便问下哪儿不同了
[/Quote]
运行一下程序,打开文件:d:\\logm2.txt" 和控制台输出进行比较.
brightyq 2012-08-05
  • 打赏
  • 举报
回复
就因为是多线程的关系。

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
Sad4This 2012-08-05
  • 打赏
  • 举报
回复
帮顶,顺便问下哪儿不同了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧