当前位置: 首页 > 面试题库 >

如何找出哪个线程正在用Java锁定文件?

梅欣然
2023-03-14
问题内容

我正在尝试删除程序中另一个线程以前使用过的文件。

我无法删除该文件,但不确定如何确定哪个线程正在使用该文件。

那么,如何找出哪个线程在Java中锁定了文件?


问题答案:

我没有一个直接的答案(我也不认为有一个答案,这是在操作系统级别(本机)而不是在JVM级别上控制的),我也没有真正看到答案的价值(一旦发现文件所在的线程,您仍然无法通过编程方式关闭该文件),但是我想您还不知道无法删除通常是由于文件仍处于打开状态引起的。当你这样做可能发生

显式调用Closeable#close()InputStreamOutputStreamReader或者Writer是绕构建File问题。

基本演示:

public static void main(String[] args) throws Exception {
    File file = new File("c:/test.txt"); // Precreate this test file first.
    FileOutputStream output = new FileOutputStream(file); // This opens the file!
    System.out.println(file.delete()); // false
    output.close(); // This explicitly closes the file!
    System.out.println(file.delete()); // true
}

换句话说,请确保在整个Java IO内容中,代码在使用后正确 关闭
了资源。正常的成语是为此在该try- with- resources声明中,这样你可以肯定的是,资源总会被释放出来,甚至在的情况下IOException。例如

try (OutputStream output = new FileOutputStream(file)) {
    // ...
}

做到这一点对 任何
InputStreamOutputStreamReaderWriter等任何工具AutoCloseable,这你打开
自己 (使用new关键字)。

在某些实现上,例如在上ByteArrayOutputStream,从技术上讲,这不是必需的,但是为了清楚起见,只需在每个地方都坚持最后的成语,以免产生误解和重构错误。

如果您尚未使用Java 7或更高版本,请改用以下try-finally惯用法。

OutputStream output = null;
try {
    output = new FileOutputStream(file);
    // ...
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
}

希望这有助于查明您特定问题的根本原因。



 类似资料:
  • 问题内容: 我尝试使用删除Linux中的文件,但出现错误: 我如何找出哪个进程正在使用此文件? 问题答案: 您可以使用以下命令: 您将收到使用该文件的进程列表。 您可以对其使用不同的标志,以接收更详细的输出。 您可以在热熔器的Wikipedia文章或页面中找到更多信息。

  • 问题内容: 在运行时是否可以以编程方式检查持有给定对象锁的线程的名称? 问题答案: 您只能说出当前线程是否持有普通锁()。没有本机代码,您将无法获得对具有锁的线程的引用。 但是,如果您要对线程进行任何复杂的处理,则可能需要熟悉java.util.concurrent包。该确实让你得到它的所有者(但其受保护的方法,所以你必须要扩展这个)。根据您的应用程序的不同,很可能是通过使用并发包,您会发现根本不

  • 问题内容: 以下函数在其自己的线程中执行: 当执行到达该行时,将引发异常: 有谁知道如何锁定对象或函数以防止并发?我试图添加一个Lock对象: 和线 在功能开始时,但是没有用。 问题答案: 为了在一个对象上调用wait(),您必须在该对象上持有同步锁(尽管该锁实际上是在线程等待时释放的): 我必须承认,在这种情况下, 为什么 您要这样做让我感到困惑…

  • 问题内容: 假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程: 运行,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序。最好将jstack的输出重定向到文件。 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。 重复步骤1和2

  • 我正在修改一个Java服务器软件。整个应用程序是单线程的。我的一个更改需要很多时间,所以我决定异步执行,以避免冻结主线程。 问题是:这种锁在Java中的最佳实现是什么?例如,我是否应该使用亲自完成。 编辑:看看我当前实现的答案。

  • 我有一个< code>JScrollpane,它包含一个大的< code>JPanel,而< code>JPanel本身包含3个< code>JPanel。这3个< code > JPanel 中的每一个都与< code>JScrollpane具有相同的大小。用户不能滚动。他可以点击一个按钮,看到下一个或上一个< code>JPanel(一次只能看到一个面板,他看不到一个面板的一部分和另一个面板的