【问题标题】:How do I make a thread wait until a file is created?如何让线程等到创建文件?
【发布时间】:2008-12-09 12:05:52
【问题描述】:

我需要一个线程来等待文件存在或创建。 到目前为止,我有以下代码:

while(!receivedDataFile.isFileExists("receiveddata.txt"))
{
    try {
        Thead.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return null;
    }
}

我运行的时候出现如下异常,线程结束:

java.lang.InterruptedException: sleep interrupted

【问题讨论】:

  • 为什么同一个问题要问两次?
  • 我忘记发了两次

标签: java multithreading file


【解决方案1】:

一个线程在阻塞时被中断(调用睡眠)并且另一个线程调用它的interrupt 方法。必须明确调用 interrupt 才能发生这种情况。

如果线程被中断,重复检查文件似乎是合乎逻辑的事情,但不知道中断的原因很难说。

像往常一样,谈到线程,Brian Goetz 对InterruptedException 的事情有话要说:

http://www-128.ibm.com/developerworks/java/library/j-jtp05236.html

【讨论】:

    【解决方案2】:

    我必须同意 Bombes 的评论:线程不会自行中断。与 Jokis 的评论相反 - 当线程上下文交换发生时,它们也不会被中断(事实上,如果一个线程休眠,它将把它的量子交给任何有工作要做的线程,但我离题了)。

    此外,我建议使用轮询文件之外的另一种通信方式。例如,您无法确定一旦您发现了一个文件,它是否已经完全写入,而无需文件编写器的额外工作(例如在准备好时重命名它,或创建一个“就绪”文件)。

    考虑使用更多的“数据推送”,例如 RMI、HTTP-POST、JMS 队列等。

    【讨论】:

      【解决方案3】:

      您应该找出哪个线程中断了该线程。线程不会自行执行此操作。

      【讨论】:

      • 拜托,你能告诉我我怎么知道哪个线程中断了那个线程
      • 捕获异常并尝试分析异常对象。里面应该有有趣的信息。
      【解决方案4】:

      如果您只想在创建文件时收到通知,并且您可以(并且愿意)采用原生 (JNI) 并且只需要 win32 支持,则可以使用代码 here

      【讨论】:

      • 是的,我只需要在创建文件时收到通知。我看到附加的代码,但我不明白什么是通知过滤器?你能告诉我吗
      • 这是您应该编译为 dll 的 c++ 代码,然后通过 JNI(java 本机接口)访问。它不是独立于平台的,并且有其他限制,而且 JNI 通过接口的速度很慢,但它工作得很好。
      【解决方案5】:

      好吧,如果您不知道 InterruptedException 是什么和/或不想对此做任何事情,那么显然除了返回和退出循环之外,您至少应该做一些事情。取出退货,然后你会一直等待。

      但我会调查一下你被打断的原因。有东西试图取消你的话题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 2015-09-04
        • 2019-06-22
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多