【问题标题】:Allow only one Thread to access a particular file in Java只允许一个线程访问 Java 中的特定文件
【发布时间】:2016-12-31 00:15:50
【问题描述】:

我有一个文件夹,里面有大量文件。有一个 cron 作业一次需要 10 个文件名,例如file1, file2....., file10 并创建 10 个新线程来读取这些文件。这些文件的内容被提取并转储到另一个进程中(不相关)并且文件被删除

现在的问题是,如果其中一个线程处理文件的时间超过一分钟,则 cron 作业会再次触发并再次拾取同一文件,因为它尚未删除并再次处理内容。

如果有另一个线程已经从它读取内容,有没有办法限制线程读取文件/创建文件对象。

我可以让一个同步的哈希映射存储 10 个线程当前正在处理的 10 个文件的详细信息,并在将文件分配给线程之前检查映射,但我发现很难相信没有更好的方法在 Java 中执行此操作。

【问题讨论】:

  • 可以尝试移动或重命名正在处理的文件,以便下次不会被 cron 拾取
  • @Guenther - 所述线程描述 FileChannel.Lock 是每个 JVM 锁而不是每个线程锁(线程在同一个 JVM 中),因此显然不是 OP 想要的

标签: java multithreading file io


【解决方案1】:

显然,您需要在不同线程之间建立一个“同步点”;为此,有很多选择。

当你的所有线程都在同一个 JVM 中运行时,你可以使用类似的类

class CurrentlyProcessedFilesTracker {
  synchronized void markFileForProcessing(File f) { }
  synchronized void markFileAsDone(File f) {

或类似的东西(如果提供的文件已知,第一个会抛出异常)。

然后你只需要确保你的所有线程都可以访问该类的同一个实例......并且它们在忙于处理某个文件时使用它来“锁定”和“解锁”。

如果有多个 JVM,事情就会变得更加复杂。那么您将需要一些进程间通信;或者您从 Scary Wombat 中寻求想法并让“调度程序部分”重命名文件(取决于您的上下文,这可能是一个好主意;或者不是;这取决于调度程序部分还有哪些其他“职责” - 你不应该也放一个组件中有很多东西)。

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多