OK, tôi đã làm việc này theo cách giải quyết câu hỏi của OP trực tiếp hơn.
Tiếp tục đọc câu trả lời ngắn cho một ví dụ Chủ đề về cách tôi sử dụng này.
Câu trả lời ngắn:
ServerSocket myServer;
Socket clientSocket;
  try {    
      myServer = new ServerSocket(port)
      myServer.setSoTimeout(2000); 
      //YOU MUST DO THIS ANYTIME TO ASSIGN new ServerSocket() to myServer‼!
      clientSocket = myServer.accept();
      //In this case, after 2 seconds the below interruption will be thrown
  }
  catch (java.io.InterruptedIOException e) {
      /*  This is where you handle the timeout. THIS WILL NOT stop
      the running of your code unless you issue a break; so you
      can do whatever you need to do here to handle whatever you
      want to happen when the timeout occurs.
      */
}
Ví dụ thế giới thực:
Trong ví dụ này, tôi có một ServerSocket đang chờ kết nối bên trong một Thread. Khi tôi đóng ứng dụng, tôi muốn tắt luồng (cụ thể hơn là ổ cắm) một cách sạch sẽ trước khi tôi đóng ứng dụng, vì vậy tôi sử dụng .setSoTimeout () trên ServerSocket sau đó tôi sử dụng ngắt được ném sau khi hết thời gian để kiểm tra và xem phụ huynh có đang cố gắng tắt chuỗi không. Nếu vậy, sau đó tôi đặt đóng ổ cắm, sau đó đặt cờ cho biết luồng đã hoàn thành, sau đó tôi thoát ra khỏi vòng lặp Chủ đề trả về giá trị null.
package MyServer;
import javafx.concurrent.Task;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import javafx.concurrent.Task;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class Server {
public Server (int port) {this.port = port;}
private boolean      threadDone        = false;
private boolean      threadInterrupted = false;
private boolean      threadRunning     = false;
private ServerSocket myServer          = null;
private Socket       clientSocket      = null;
private Thread       serverThread      = null;;
private int          port;
private static final int SO_TIMEOUT    = 5000; //5 seconds
public void startServer() {
    if (!threadRunning) {
        serverThread = new Thread(thisServerTask);
        serverThread.setDaemon(true);
        serverThread.start();
    }
}
public void stopServer() {
    if (threadRunning) {
        threadInterrupted = true;
        while (!threadDone) {
            //We are just waiting for the timeout to exception happen
        }
        if (threadDone) {threadRunning = false;}
    }
}
public boolean isRunning() {return threadRunning;}
private Task<Void> thisServerTask = new Task <Void>() {
    @Override public Void call() throws InterruptedException {
        threadRunning = true;
        try {
            myServer = new ServerSocket(port);
            myServer.setSoTimeout(SO_TIMEOUT);
            clientSocket = new Socket();
        } catch (IOException e) {
            e.printStackTrace();
        }
        while(true) {
            try {
                clientSocket = myServer.accept();
            }
            catch (java.io.InterruptedIOException e) {
                if (threadInterrupted) {
                    try { clientSocket.close(); } //This is the clean exit I'm after.
                    catch (IOException e1) { e1.printStackTrace(); }
                    threadDone = true;
                    break;
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
};
}
Sau đó, trong lớp Trình điều khiển của tôi ... (Tôi sẽ chỉ hiển thị mã có liên quan, xoa bóp nó vào mã của riêng bạn khi cần)
public class Controller {
    Server server = null;
    private static final int port = 10000;
    private void stopTheServer() {
        server.stopServer();
        while (server.isRunning() {
        //We just wait for the server service to stop.
        }
    }
    @FXML private void initialize() {
        Platform.runLater(()-> {
            server = new Server(port);
            server.startServer();
            Stage stage = (Stage) serverStatusLabel.getScene().getWindow();
            stage.setOnCloseRequest(event->stopTheServer());
        });
    }
}
Tôi hy vọng điều này sẽ giúp ai đó xuống đường.