我有两个线程(主线程和工作线程)。
工作线程从某个套接字源读取输入(通过BufferedInputStream使“返回”成为可能),将读取的数据打包到数据结构中,并将结果添加到BlockingQueue (这是线程安全的)。
在某个时候,主线程决定结束它并关闭BufferedInputStream。
如何知道工作线程是否关闭了BufferedInputStream?
通常,mInputStream.read()在EOF上返回-1,但是当流关闭时不会发生这种情况。相反,会抛出一个IOException,告诉我流已关闭。
工作线程必须优雅地结束,但是it如何发现流是关闭的?
它不能从异常类中分辨原因:类只是IOException。它可以测试e.getMessage().contains("closed"),但它很容易出错:在某些版本的Android上,信息可能是“关闭”或“不打开”,而像“除非关闭”这样的散文则会产生假阳性。
我想到的最好的事情是:
private static boolean _isOpen(InputStream inputStream) {
try {
inputStream.available();
} catch (IOException e) {
return false;
}
return true;
}这种副作用(抛出异常)已经有了一定的记录,但是测试流是否关闭并不是available()的主要功能;总有一天,有人会编写一个只返回0的实现。
还有其他建议吗?
发布于 2014-09-26 09:41:25
异常仅用于“异常”状态条件,例如连接失败或磁盘故障。
因此,听起来似乎无法让主线程指示工作线程停止处理流,这在主线程拥有资源的情况下通常会发生。
此外,JDK文档(http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.htmls声明:
类InputStream的可用方法总是返回0。 引发: IOException -如果发生I/O错误。
正如问题的注释中所建议的:简单地从流中读取并捕获IOExceptions。如果资源变得不可用,工作线程将通过这种方式获得异常来注意。
https://stackoverflow.com/questions/26056329
复制相似问题