如何中断这个帖子?

时间:2013-10-31 12:39:21

标签: java multithreading

我有以下代码:

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()"当主机错误时阻塞线程。如何从另一个线程中断此代码?

4 个答案:

答案 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(...)方法中断。引用我的答案:

  

I want my thread to handle interruption, but I can't catch InterruptedException because it is a checked exception

     

重要的是要意识到t.interrupt()只设置线程中的中断位 - 它实际上并不会中断线程的处理本身。线程可以随时安全中断。

因此,如果线程在readLine(...)中被阻止,则无法中断该线程。但是,您可以将循环更改为:

while (!Thread.currentThread().isInterrupted()) {
   String line = in.readLine();
   if (line == null) {
       break;
   }
   builder.append(line);
}

正如其他人所提到的,您可以关闭基础InputStream,这会导致readLine()抛出Exception