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