多个线程同时写一个文件,该怎么做? 请问:不同线程中的流指向同一个文件,并对这个文件进行写操作,但写的位置不会相互覆盖,是否会有访问冲突?谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 回二楼:多个线程共用一个流正是我现在的策略,但是会有一个问题,流是要关闭以后才把内容写到文件内的,而我的主线程是一个while(true)循环,也就是说主线程永远不会退出,而全局流是主线程内的一个变量,我现在的办法是每隔一段时间对该全局流进行一次关闭操作(每30秒对文件进行一次更新,以便能看到最新的文件内容),但是,如果在关闭之后,重新打开之前(虽然这个时间段非常短),正好某个线程调用了该流来写文件,就会出错,这样程序就变得不可预期了(不知道什么时候会出错)。回三、四楼:如果使用同步,某些线程会执行一些很耗时的操作(但不是写文件操作),有的时候甚至是几个小时,如果这些线程占用这个文件一直不释放,就会极大的影响程序性能,违背了我使用多线程的初衷。 三楼:“但是线程的行为却是无法预期的”——我不对文件进行读操作,只是写,而且是以append的方式,追加到文件末尾,不存在脏读的问题,如果可以同时访问的话,顶多只是输出的内容顺序有些错乱。 回lixkyx:其实我程序的主要功能已经实现了,当然主要功能不是用来写文件(而是用来处理那个耗时的操作以提高性能),写文件只是实现日志记录,如您所言,如果没有更好的实现办法,那我就干脆放弃日志,使用控制台输出好了。只是这样就无法查询过往的执行记录了。 ADemon_T的方法可行,我周一去试一下。另外我想到一个方法,大家看是否可行:建立一个控件,将所有输出都显示在控件内,然后定期保存控件内的内容。思想和ADemon_T很类似。 不知道RandomAccessFile行不行的通啊!当然,同步控制是少不了的! 根据我的测试,多个线程是允许写同一个文件的。参考这个HTTP多线程,端口侦听和服务的完整程序实现的是一个多线程下载的代码。 ThreadLocal 昨天刚看过这个介绍,本人认为用这个应该可以吧 操作系统中的信号量啊,别用多线程共享一个流,这样很容易混乱轮到这个线程就打开文件,读或者写,关闭文件这三个操作封装起来做成原子的几个线程共享一个静态int常量做锁 回sunxyz86:很好的方法!谢谢! "流是要关闭以后才把内容写到文件内的"? flush()一下不就写进去了吗? "回lixkyx:其实我程序的主要功能已经实现了,当然主要功能不是用来写文件(而是用来处理那个耗时的操作以提高性能),写文件只是实现日志记录,如您所言,如果没有更好的实现办法,那我就干脆放弃日志,使用控制台输出好了。只是这样就无法查询过往的执行记录了。"如果你使用后台线程的目的只是为了写日志,那反而简单了。因为日志可以定期来写,不需要随时运行,你完全可以定义一个平时阻塞,定时运行(或者紧随其他线程完成文件操作之后运行),从而实现你要的功能。通常Office里的自动保存功能就是通过这样的后台线程实现的。 将文件分割成BYTE流---分成N份start《first part》#1 #1 《second part》#2....#n 《second part》#end最后将特殊字符消除即可。所以迅雷的文件在下载的时候预存大小就是文件大小。甚至比这个大。 线程对临界资源的访问要通过同步来控制,也就是对资源实现锁控制或是synchozied进行控制 我刚写了一个 你可以试试看 RandomAccessFile rfile=null; FileChannel f =null; while(true) { try{ rfile=new RandomAccessFile(WriteBasePath,"rw"); f = rfile.getChannel(); if(f != null) break; else Thread.sleep(1*100); }catch(java.io.FileNotFoundException e) { } } while(true) { try{ if(f.tryLock().isValid()) break; else Thread.sleep(1*100); }catch(OverlappingFileLockException e) { } } long fileLength = rfile.length(); rfile.seek(fileLength); rfile.writeBytes(Info+"\r\n"); rfile.close(); 问题 我想用webwork但是不想用spring作电子商务网站的用什么架构亚 如何在TextArea控制输出格式? 菜鸟第一次使用JCreator,有问题想请教 奇怪的的问题,见者有分!! 正则表达式的爱好者请进! 一个菜菜的问题! 现在有多少人用java Not in GZIP format报错求助 用for循环打印出下面的三角形 求编写词法分析器的思路 关于File的isFile()和isDirectory()方法的疑问
回三、四楼:如果使用同步,某些线程会执行一些很耗时的操作(但不是写文件操作),有的时候甚至是几个小时,如果这些线程占用这个文件一直不释放,就会极大的影响程序性能,违背了我使用多线程的初衷。
另外我想到一个方法,大家看是否可行:
建立一个控件,将所有输出都显示在控件内,然后定期保存控件内的内容。
思想和ADemon_T很类似。
HTTP多线程,端口侦听和服务的完整程序实现的是一个多线程下载的代码。
轮到这个线程就打开文件,读或者写,关闭文件
这三个操作封装起来做成原子的
几个线程共享一个静态int常量做锁
#1 《second part》#2
....
#n 《second part》#end最后将特殊字符消除即可。所以迅雷的文件在下载的时候预存大小就是文件大小。甚至比这个大。
FileChannel f =null;
while(true)
{
try{
rfile=new RandomAccessFile(WriteBasePath,"rw");
f = rfile.getChannel();
if(f != null)
break;
else
Thread.sleep(1*100);
}catch(java.io.FileNotFoundException e)
{
}
}
while(true)
{
try{
if(f.tryLock().isValid())
break;
else
Thread.sleep(1*100);
}catch(OverlappingFileLockException e)
{
}
}
long fileLength = rfile.length();
rfile.seek(fileLength);
rfile.writeBytes(Info+"\r\n");
rfile.close();