工程中有A,B两个线程,其中A线程负责从客户端接受文件放入到指定目录中,而B线程负责从目录获取文件解析文件。问题:当线程B 在目录获取文件时,如何判断文件已经被A线程接收完毕或者A线程接受过程中 B线程不能操作文件
(如何对B线程处理,A线程最好不要改动)

解决方案 »

  1.   

    当线程B在读取文件时不能让A线程操作这个文件,对于这个情况是可以对操作加入同步。但是这样还是不能解决问题(比如对于线程B可以重复读取文件内容或线程A重复写文件内容的情况)。所以还必须加入等待与唤醒。可以增加一个标志位,比如标志位为boolean型变量,如果标志位的内容为true,则表示线程A可以向目录文件写内容,但是不能读取,此时执行到线程B则应该等待;线程A写完了内容后修改标志位通知线程B来取文件。(反之一样)。
      

  2.   

    建议用最简单的方式,把B做成线程池就行了。A将文件写入指定目录后,就增加一条任务进线程池(也就是B),然后B就会傻傻的根据该任务去解析目标文件。这样你可以很灵活的控制A的数量(中间件的服务线程数)和B的数量(线程池规模),又绕开了复杂的同步问题。
      

  3.   

    可以A打开文件时给文件上锁。
    关于java文件锁,请参考下面链接。 我觉得方式二好。
    http://blog.sina.com.cn/s/blog_46e73e77010001cj.html