【发布时间】:2012-07-05 04:17:06
【问题描述】:
我们有一个多线程程序,它执行以下操作:
thread_1 是硬盘监听器,用于检测创建的新文件。我们在 Java 7 中使用 WatchService api。当另一个程序创建新文件时,thread_1 检测并获取它并将其放入 PriorityBlockingQueue 前:
priorityBlockingQueue.add(FileObject)
FileObjComparator 是一个自定义对象实现比较器。它是按创建时间和FileObject 中的fileCreatedTime 字段排序的,我在检测到这个文件时从系统时间得到:
public int compare(FileObject o1, FileObject o2) {
return o1.getFileCreatedTime().compareTo(o2.getFileCreatedTime());
}
priorityBlockingQueue 初始化为:
DataFileQueue.priorityBlockingQueue = new PriorityBlockingQueue<FileObject>(100000, new FileObjComparator());
并且Thread_2 将在此priorityBlockingQueue 中的最后一个文件旁边处理此文件
if(priorityBlockingQueue.size) > 1)
process(priorityBlockingQueue.poll());
2 个线程并行运行,但是当我处理大量大文件时,有时Thread_2 会在一个正在写入的文件处理该文件。我检测到这一点是因为重新检查内容文件和处理结果。
此程序在 Centos 6.2 上运行,此硬盘分区以异步模式挂载。感谢您的帮助。
【问题讨论】:
-
"有时 Thread_2 处理一个 文件正在写入我检测到这一点,因为重新检查内容文件和处理结果。"不是很清楚。您检测到 Thread2 正在写入不应该写入的文件?
-
我保证这个文件是由一个(并且只有另一个程序)创建的,并且在创建文件时不会对其进行任何修改:( :(
-
@tubcvt 请看我更详细的回答。
-
另一个正在写入文件的程序是什么?
-
这是第三个第三方程序,我无法更改它的代码。
标签: java multithreading file-io concurrency java-io