我有两个线程(主线程和工作线程)。
工作线程从某个套接字源读取输入(通过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的实现。
还有其他建议吗?
答案 0 :(得分:-1)
例外意味着用于"例外"仅限状态条件,例如连接失败或磁盘故障。
所以听起来好像你不能让主线程指示worker-thread停止处理流,这通常发生在主线程拥有资源的场景中。
此外,JDK文档(http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.htmls声明:
类 InputStream 的可用方法始终返回0.
抛出: IOException - 如果发生I / O错误。
正如问题的评论中所建议的:只需从流中读取并捕获IOExceptions。如果资源变得不可用,工作线程将通过这种方式获取异常来通知。