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

时间:2018-04-11 15:29:02

标签: java multithreading inputstream blocking

据我了解,一旦线程启动,它可以完成其操作并自动停止,或者如果它在循环中执行某些工作,则需要定期检查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
}

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

1 个答案:

答案 0 :(得分:2)

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

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