考虑以下情况:
我的问题是:
在java中可能是:
恶魔
处理一个( Writer ):
...
while(!done){
String nextLine;//process the line
writeLine(nextLine);
...
}
...
第二个过程(读者):
...
while(hasNextLine()){
String nextLine= readLine();
...
}
...
注意:
作家进程具有优先权。所以没有什么必须干扰它。
答案 0 :(得分:3)
由于您谈论的是进程,而不是线程,所以答案取决于底层操作系统如何管理打开的文件句柄:
open(2)
O_RDONLY
标志,lseek(2)
和read(2)
的系统调用 - 已知不会干扰系统调用Writer正在调用,例如write(2)
。如果您需要一种方法让两个进程通过文件进行通信,您可以使用一些在读取器和写入器之间传递元信息的额外文件来完成,例如是否有Writer当前正在运行。将一些结构引入文件也很有用(例如,每个Writer都会在文件中附加一个字节,表明正在进行写入过程)。
对于非常快速的非阻塞I / O,您可能需要通过Java MappedByteBuffer
考虑内存映射文件。
答案 1 :(得分:0)
代码不会崩溃。但是,即使作者仍在写作,读者也会在到达目的地时终止。你必须以某种方式同步!
答案 2 :(得分:0)
关注:
即使您认为另一个作者线程已更新变量值
,您的读者线程也可以读取陈旧值即使您没有同步也写入文件,在阅读时会看到不同的值
答案 3 :(得分:0)
Java文件IO和普通文件不是为同时写入和读取而设计的。要么你的读者超过你的作家,要么你的读者永远不会完成。
JB Nizet在他的评论中提供了答案。您在阅读时使用BlockingQueue来保存作者数据。队列将清空,或者读者永远不会完成。您可以通过BlockingQueue方法检测这两种情况。