我有以下代码:
public class Net {
public static void main(String[] args) {
Runnable task = new Runnable() {
@Override
public void run() {
String host = "http://example.example";
try {
URL url = new URL(host);
StringBuilder builder = new StringBuilder();
HttpURLConnection con = (HttpURLConnection) url.openConnection();
try(BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
String line;
while (null != (line = in.readLine())) builder.append(line);
}
out.println("data: " + builder.length());
con.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread(task);
thread.start();
thread.interrupt();
}
}
这" con.getInputStream()"当主机错误时阻塞线程。如何从另一个线程中断此代码?
答案 0 :(得分:3)
一般规则是从“外部”中断不间断线程,即
答案 1 :(得分:1)
使用setReadTimeout
设置超时值。如果超时到期,请抓住SocketTimeoutException
并按照您希望的方式恢复或终止程序。
答案 2 :(得分:1)
不幸的是,您无法中断已被某些I / O操作阻止的线程(除非您使用NIO)
您可能需要关闭读取线程已被阻止的流(由另一个线程)
这样的事情:
public class Foo implements Runnable{
private InputStream stream;
private int timeOut;
....
public void run(){
Thread.sleep(timeOut);
if(<<ensure the victim thread still is stuck>>){
stream.close();//this will throws an exception to the stuck thread.
}
}
....
}
答案 3 :(得分:0)
当主机出错时,这个“con.getInputStream()”会阻塞线程。如何从另一个线程中断此代码?
这是常见问题解答。中断线程不会导致readLine(...)
方法中断。引用我的答案:
重要的是要意识到t.interrupt()只设置线程中的中断位 - 它实际上并不会中断线程的处理本身。线程可以随时安全中断。
因此,如果线程在readLine(...)
中被阻止,则无法中断该线程。但是,您可以将循环更改为:
while (!Thread.currentThread().isInterrupted()) {
String line = in.readLine();
if (line == null) {
break;
}
builder.append(line);
}
正如其他人所提到的,您可以关闭基础InputStream
,这会导致readLine()
抛出Exception
。