我想设置一个用 Java 读取的阻塞文件。也就是说,有一个文件,当被调用FileInputStream
任何read()
方法时,调用会阻塞。
我想不出一种简单的独立于操作系统的方式——在类 Unix 操作系统上,我可以尝试使用mkfifo
该文件创建一个 FIFO 并从中读取。一种可能的解决方法是创建一个非常大的文件并从中读取 - 在我捕获堆栈之前读取不太可能完成,但它丑陋且缓慢(实际上,缓存时读取仍然可以非常快)。
相应的套接字read()
情况很容易设置 - 自己创建一个套接字并从中读取,您可以进行确定性阻塞。
目的是检查方法的堆栈以确定在这种情况下的顶部帧是什么。想象一下,我有一个组件,它定期对所有正在运行的线程的堆栈跟踪进行采样,然后尝试对该线程目前正在做什么进行分类。它可以做的一件事是文件 IO。所以我需要知道文件 IO 期间的“栈顶”是什么样的。我已经通过实验确定了这一点(只需以各种方式读取文件并对堆栈进行采样),但我想编写一个测试,如果这种情况发生变化,它将失败。
编写此类测试的自然方法是启动一个执行文件读取的线程,然后检查顶部帧。为了可靠地做到这一点,我想要一个阻塞读取(否则线程可能会在获取堆栈跟踪之前完成它的读取,等等)。