jjzjj

Java FileLock 无异常阻塞;等待锁

coder 2024-03-08 原文

我发现 Java 文件锁定机制是一个真正的错误,因为它不能执行锁定的第一条规则 - 阻塞对锁定的调用!除非我错了 - 如果应用程序已经保持对文件的锁定,则调用 lock() 将抛出异常,我知道我的应用程序就是这种情况。我在这里查看了一些答案,不幸的是我没有使用 Java 7。

有没有人建议我如何处理排他文件锁的等待,而不是让自己陷入 while(true) 循环 :)

在 Aubin 的回答后进行编辑(从评论中复制):

我想做的是在将一个大文件复制到一个目录后访问它,然后对其进行处理。我的代码很简单...

public boolean ifFileReady(File file) {
   boolean ready = false;
   FileLock lock = null;
   FileChannel channel = null;
   try {

      channel = new RandomAccessFile(file, "rw").getChannel();
      lock = channel.lock();
      lock.release();
      ready = true;
   }
   catch( IOException e ) {
      // Always Here
   }
   finally
   {
      if (channel != null)
         channel.close();
   }
   return ready;
}

我从不堵在锁上。它总是抛出

最佳答案

以下代码演示了 lock 确实会阻塞而不会抛出异常。我遇到了类似的问题,但发现异常实际上是由于我的用户没有权限打开文件 rw 引起的。

这是一个完整的程序;同时运行它的两个实例以进行演示

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;

public class Test {
  public static void main(String args[]) throws Exception {
    FileChannel channel = null;
    File lockFile = new File("lock");
    System.out.println ("Opening file...");
    channel = new RandomAccessFile(lockFile, "rw").getChannel();
    System.out.println ("File open. Locking channel...");
    channel.lock();
    System.out.println ("Channel locked. Sleep for 30 seconds");
    Thread.sleep (30000);
    System.out.println ("Process terminating");
    }
}

为了使代码更简洁,我没有包括解锁、关闭或异常处理(您将收到编译器警告)。进程退出时,操作系统应自动释放所有资源。

关于Java FileLock 无异常阻塞;等待锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978064/

有关Java FileLock 无异常阻塞;等待锁的更多相关文章

  1. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  2. ruby - Watir ... sleep 和等待之间的区别 - 2

    有什么显着的区别吗sleep10和wait_until(10)他们似乎都在做同样的事情:WAITING10秒,然后继续下一步 最佳答案 sleep在指定时间内什么都不做。wait_untiltakesablock.它一直等到block评估为真或超时。如果没有给出block,它们的行为相同。 关于ruby-Watir...sleep和等待之间的区别,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

  3. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  4. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  5. ruby - 如何让 Selenium/Ruby 机器人在执行操作之前等待? - 2

    我正在构建一个点击元素的Selenium/Ruby网络机器人。问题是,有时在机器人决定找不到元素之前没有足够的时间加载页面。让Selenium在执行操作之前等待的Ruby方法是什么?我更喜欢显式等待,但我也接受隐式等待。我尝试使用wait.until方法:require"selenium-webdriver"require"nokogiri"driver=Selenium::WebDriver.for:chromewait=Selenium::WebDriver::Wait.new(:timeout=>15)driver.navigate.to"http://google.com"dr

  6. ruby - 如何等待 Selenium 中的页面重定向? - 2

    我正在尝试执行一项相对简单的任务:WAITING页面重定向完成。刚刚看到another回答了有关该主题的问题,建议是等待后一页上的特定文本出现(如果我做对了)。如果是这样,等到window.location发生变化怎么样?好点吗?更差?不太适用?还有其他想法吗?只是好奇,如果需要,可以将此问题标记为社区wiki。谢谢! 最佳答案 是的,我在使用Selenium时遇到过很多次这个问题。我有两种方法解决这个问题。首先,您实际上可以更改隐式等待时间。例如给定这段代码:Actionsbuilder=newActions(driver);bu

  7. ruby - Puppet 等待服务准备就绪 - 2

    我正在使用Puppet进行机器配置。我有一个服务在Tomcat6应用程序服务器中运行,另一个list依赖于该服务(发送一些REST请求作为安装的一部分)。问题是,在开始使用tomcat后,该服务不可用:service{"tomcat6":ensure=>running,enable=>true,hasstatus=>true,hasrestart=>true;}所以我需要另一个list的一些要求条件,以确保服务真正运行(例如检查某些URL是否可用)。如果它还没有准备好,请等待一段时间,然后再试一次,并限制重试次数。是否有一些惯用的Puppet解决方案或其他解决方案可以实现这一目标?注意

  8. ruby 非阻塞行读取 - 2

    我正在尝试以非阻塞方式从io中读取一行。不幸的是readlineblock。我想我可以用read_nonblock解决这个问题,并在其中存储部分结果的附加缓冲区,检查缓冲区中是否有多行等。但是对于像这样的简单任务来说似乎有点复杂.有更好的方法吗?注意:我正在使用事件多路分解(select)并且我对此很满意,我不想创建线程,使用EventMachine等... 最佳答案 我认为read_nonblock解决方案可能是可行的方法。简单但不是最高效的猴子补丁版本:classIOdefreadline_nonblockrlnb_buffer

  9. ruby-on-rails - 了解为什么 ruby​​ 进程在 100% CPU 时阻塞的方法 - 2

    我们有一个大型Rails应用程序,几天后,我们的ruby​​进程似乎陷入循环并占用100%的CPU,直到乘客服务器死机并引发502错误。您知道找出原因的最佳方法吗?我已经尝试过NewRelic,但它只是性能方面的东西,而且我们的错误太多了,无法猜测问题出在哪里。(我们每天有很多请求和很多UTF-8BSON错误,因为我们使用的是UTF-8url)使用:Rails3.2.6和Ruby1.9.2p290乘客3.0.13MongoDB2.0.1和Mongoid2.4.11NginxFreeBSD8.2 最佳答案 找出ruby卡住位置的简便方

  10. ruby - 如何等待系统命令结束 - 2

    我正在使用Ruby中的系统命令转换XLS2CSV文件。转换后我正在处理CSV文件,但是当程序要处理文件时转换仍在运行,所以那时它们不存在。谁能告诉我是否可以让Ruby等待系统命令完成的正确时间?现在我正在使用:sleep20但是如果一次要花更长的时间,那当然是不对的。我具体做的是这样的:#Callontheprogramtoconvertxlscommand="C:/Development/Tools/xls2csv/xls2csv.exeC:/TDLINK/file1.xls"system(command)do_stuffdefdo_stuff#Thisiswhereiusefile

随机推荐