具体来说,问题是写一个这样的方法:
int maybeRead(InputStream in, long timeout)
Run Code Online (Sandbox Code Playgroud)
如果数据在'timeout'毫秒内可用,则返回值与in.read()相同,否则为-2.在方法返回之前,任何生成的线程都必须退出.
为了避免参数,这里的主题是java.io.InputStream,由Sun(任何Java版本)记录.请注意,这并不像看起来那么简单.以下是Sun的文档直接支持的一些事实.
in.read()方法可能是不可中断的.
将InputStream包装在Reader或InterruptibleChannel中没有帮助,因为所有这些类都可以调用InputStream的方法.如果可以使用这些类,则可以编写一个直接在InputStream上执行相同逻辑的解决方案.
in.available()返回0总是可以接受的.
in.close()方法可能会阻塞或不执行任何操作.
没有通用的方法来杀死另一个线程.
我有一个执行以下代码的线程:
public void run() {
try {
int n = 0;
byte[] buffer = new byte[4096];
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
out.flush();
}
} catch (IOException e) {
System.out.println(e);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里in是System.in.我怎样才能优雅地停止这样的线程?无论是关闭System.in还是使用Thread.interrupt似乎都不起作用.
我有一个DataInputStream我从一个Socket.有什么办法可以设置超时dis.read(...)吗?目前我产生了一个新线程来进行读取.虽然父线程thread.join(timeout)在中断之前会等待.我知道nio,但我认为我不想在这一点上重构那么多.谢谢.