gpt4 book ai didi

java - 什么会导致 ReadableByteChannel.close() 阻塞?

转载 作者:行者123 更新时间:2023-12-04 06:19:28 28 4
gpt4 key购买 nike

我正在尝试运行一个带有超时的外部进程并读取它产生的所有输出。事实证明,这是一项令人惊讶的艰巨任务。我的基本策略是使用 ProcessBuilder 启动一个进程并在主线程中读取它的输出。另一个线程被关闭,等待超时到期,并且(如果需要)在我传递给它的 ReadableByteChannel 上调用 close(),在进程上调用 destroy() 也传递给它。

这似乎在打印无限输出的过程中工作得很好,甚至得到预期的 AsynchronousCloseException。但是,当对一个无限 hibernate 的程序进行测试时,线程会在关闭时阻塞:

private void terminateProcess() {
try {
System.out.println("About to close readChannel.");
readChannel.close();
System.out.println("Closed the readChannel.");
} catch (IOException e) {
// Not relevant
}
}

我从来没有看到第二个打印语句,我的测试永远挂起。 javadoc 说 close() 可以在另一个关闭操作中阻塞,但是在我的代码中没有其他对 close() 的调用。还有什么可能导致这种情况?

最佳答案

测试永远挂起的原因是如果 ReadableByteChannel.read() 阻塞它, ReadableByteChannel.close() 将阻塞。

从文档中可以看出,阻塞模式下的 ReadableByteChannel(默认情况下所有 channel 都是)将阻塞直到至少读取一个字节,如果您的 ByteBuffer 中有一个字节空闲,那么读取将被阻塞。

如果您阅读类 java.nio.channels.Channels$ReadableByteChannelImpl(在 Channels.java 中找到)的代码,您将看到 ReadableByteChannelImpl 被注释为“不是真的可中断” - 显然,他们是这个意思。

如果您调用 Process.destroy(),这将终止一个没有产生输入的进程,并导致从您的读取线程中抛出 AsynchronousCloseException。

关于java - 什么会导致 ReadableByteChannel.close() 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6778067/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com