Java 停止在读取输入流时阻塞的线程

Java stopping a thread blocked on input stream read

据我了解,一旦线程启动,它可以完成其操作并自动停止,或者如果它在循环中执行某些工作,则需要定期检查 Thread.isInterrupted()判断是否需要退出循环。

public void run() {

  //initialize input stream
  .....
  byte[] buffer = new byte[1024];
  int len = -1;
  while((len = inputStream.read(buffer)) != -1 && 
 !Thread.isInterrupted()) {
  //write the buffer to some output stream

 }

}

但是,假设线程卡在对 :-

的调用中
public void run() {
//initialize input stream
.....
    InputStream.read(buffer)
    here, buffer = new byte[FILE_SIZE]
    and FILE_SIZE = 100 * 1024 * 1024;//100 MB
}

那么在这种情况下我们如何停止这个 运行 线程?

如果您知道实际的流类型,就会发生这种情况。例如在 BufferedInputStream 的情况下,您可以使用 available(),找出可以读取多少字节而不会被阻塞。

通常为了能够中断线程执行,您应该尝试使用较小的缓冲区读取流。
但是,如果您希望尽管缓冲区大小很小,但读取操作仍会阻塞很长时间,并且您希望能够在该点停止,则可以以准备接收 Thread.stop() 的方式编写代码(例如,如果线程在发送 interrupt() 后 5 秒内没有停止)。