Если интересует конкретно как прерывать ServerSocket.accept(), то, по идее, close() из другого потока вызывает SocketException в методе accept().
Есть ещё вариант (наверное, немного более правильный) при инициализации установить setSoTimeout() и в цикле вызывать accept() перехватывая SocketTimeoutException. В catch блоке проверять некую volatile boolean переменную - признак того что нужно ли остановить поток. Тогда чтобы остановить поток сервера просто меняете эту переменную и поток сам останавливается.
Ещё более правильный способ - использовать nio, желательно с использованием какой-нибудь библиотеки типа netty.