如何阻止这种线程?

时间:2014-03-27 13:10:06

标签: java multithreading

我有一个拥有此代码的线程

while(!this.isInterrupted()) {
    try {
        socket = server.accept();
    }
    catch(IOException e) {
        continue;
    }
}

当我从某个地方调用中断方法时,它只有在检查条件时才会停止执行。如果程序在server.accept()语句中怎么办?在任何套接字发出任何请求之前,它不会停止。我希望当我调用中断方法时,应该立即停止。有没有解决这个问题的方法。

4 个答案:

答案 0 :(得分:5)

覆盖线程中的interrupt()方法,如下所示:

@Override
public void interrupt() {
    super.interrupt();
    socket.close();
}

当另一个线程中断此线程时,套接字将关闭。当线程当前位于accept()内时,接受将通过抛出SocketException立即退出。你的catch-block将捕获该异常(SocketExceptionIOException的子类)并且将执行while语句中的检查,然后将注意到isInterrupted()标志已设置并退出。

与目前接受的解决方案相反,它将立即退出,而不是等待最多10秒钟。

答案 1 :(得分:4)

您可以在ServerSocket上设置超时:

server.setSoTimeout(10000);

当你现在调用accept方法时,它将接受10秒的新连接,然后抛出SocketTimeoutException。然后你可以再次接受。

答案 2 :(得分:1)

好吧,你可以使用弃用的destroy()方法停止 残酷谋杀线程,但是你真的不应该这样做,因为你不能#39;知道那一刻它在做什么。有可能接受方法目前处于某些操作的中间,如果没有清理,就不能中断。

更好的解决方案是从另一个线程调用server.close()。在这种情况下,接受将通过抛出SocketException退出。

要允许另一个线程执行此操作,您需要以某种方式公开对服务器套接字的引用,或者您需要向Thread类添加一个公共方法,该方法可以从另一个线程调用,然后调用{ {1}}。最好的观点取决于您发布的代码段周围的代码的外观。

答案 3 :(得分:0)

您可以扩展ServerSocket并覆盖implAccept()方法,而不是超时并检查中断标志。

或者您可以创建另一个监视父线程状态的线程,并在中断它时关闭套接字。

public void close()
           throws IOException
Closes this socket. Any thread currently blocked in accept() will throw a SocketException.
If this socket has an associated channel then the channel is closed as well.