【问题标题】:How to interrupt a Thread in Java which waits for incoming Connection [duplicate]如何中断等待传入连接的Java线程[重复]
【发布时间】:2016-11-16 09:57:08
【问题描述】:
我有以下设置:首先,我有一个使用 Swift 作为大型机的 GUI。然后我想按下一个按钮并开始一个新的线程。如果我再次按下按钮,线程应该停止。线程正在等待传入 TCP-Connection:
ServerSocket clientSocket = welcomeSocket.accept();
现在我尝试在 GUI 中调用 thread.interrupt(); 来停止线程,但由于 .accept 是阻塞系统调用,它无法正常工作。我该怎么做才能阻止线程等待新连接?我不想使用thread.stop(),因为它已被弃用。
有什么解决办法吗?
【问题讨论】:
标签:
java
multithreading
serversocket
【解决方案1】:
如果没有任何连接,您可以使用setSoTimeout(1000) 使对 accept() 的调用在 1 秒后超时(通过抛出 java.net.SocketTimeoutException)。然后你可以在一个循环中检查线程信号如下:
try (ServerSocket serverSocket = new ServerSocket(8080)) {
serverSocket.setSoTimeout(1000);
//active is a volatile boolean manipulated by the control thread
while (active) {
try {
Socket s = serverSocket.accept();
somebodyConnected(s); //do something important here
catch (java.net.SocketTimeoutException) {} //expected
}
System.out.println("exiting");
} //the try-with-resources ensures the ServerSocket is gracefully closed