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

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

...全文
379 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
  • 打赏
  • 举报
回复
帮顶,顺便问下哪儿不同了
串联谐振双有源桥(SR-DAB)DC-DC变换器闭环仿真研究内容概要:本文围绕串联谐振双有源桥(SR-DAB)DC-DC变换器的闭环仿真展开研究,重点探讨其在电力电子系统中的动态响应特性与控制策略。通过对SR-DAB变换器建立数学模型,并结合Matlab/Simulink进行闭环仿真,分析系统在不同工作条件下的电压、电流波形及功率传输效率,验证控制算法的有效性与稳定性。研究涵盖系统建模、控制器设计(如PI控制)、软开关实现条件、抗干扰能力以及动态调节性能,旨在提升变换器在新能源、储能、数据中心供电等场景中的可靠性和能效水平。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、微电网、电力系统仿真等相关领域的科研人员与工程技术人员。; 使用场景及目标:①用于高校及科研机构开展DC-DC变换器控制策略的教学与实验;②为工业界在高效率隔离型功率变换系统的设计与优化提供仿真依据和技术支撑;③服务于数据中心、电动汽车、可再生能源并网等场景下的电源系统研发。; 阅读建议:建议读者结合Matlab代码实践仿真流程,重点关注系统建模与控制器参数整定部分,通过调整负载、输入电压等条件观察系统响应,深入理解闭环控制对变换器性能的影响机制。
内容概要:本文介绍了FastReport VCL/FMX/LCL 2026.2.4版本的更新内容,重点涵盖核心引擎、图形处理、用户界面及导出功能的优化与修复。主要更新包括修复了Developer Express兼容性问题、TfrxSVGGraphic在TImage中的显示问题、PDF/A导出合规性、EMF图像旋转异常,以及ReportTree拖拽功能等问题。同时,部分模块新增了HTMLTags对XLSX导出的支持、内置右键菜单和新图标,并改进了FastCube组件的元素调整体验。此外,还修复了CPP脚本中Result参数名的Bug以及自定义过滤器中OR操作失效的问题。; 适合人群:使用Delphi或Lazarus进行开发,且涉及报表设计与数据展示功能的中高级开发者;尤其适用于需要集成FastReport控件到企业级应用中的技术人员。; 使用场景及目标:①提升报表系统在不同平台(VCL/FMX/LCL)下的稳定性和兼容性;②满足PDF/A标准的文档归档需求;③优化用户交互体验,如拖拽操作与元素缩放;④增强脚本支持与数据集字段识别能力,确保开发效率与功能完整性。; 阅读建议:建议结合官方更新链接和实际项目中使用的FastReport模块对照查看,重点关注自身所用组件(如VCL、FMX或Lazarus版)的具体修复项,及时升级以规避已知问题并利用新特性优化报表功能。

62,621

社区成员

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

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