У меня есть основной серверный поток c, в котором я принимаю сокеты с функцией accept (). В течение определенного периода времени мне нужно избегать подключения новых розеток. Я хочу сделать это из другого потока, сказав серверному потоку не устанавливать новые подключения.
public class ServerThread extends Thread {
private boolean running = false;
private final ConnectionManager connectionManager;
private final AtomicBoolean acceptNewConnections;
ServerThread(ConnectionManager connectionManager, int port) {
super("ServerThread");
this.connectionManager = connectionManager;
this.port = port;
this.acceptNewConnections = new AtomicBoolean(false);
}
// This is called from other threads
public void setAcceptNewConnections(boolean value) {
acceptNewConnections.set(value);
}
@Override
public void shutdown() {
acceptNewConnections.set(false);
running = false;
try {
join();
} catch (InterruptedException ignored) {}
}
@Override
public void run() {
running = true;
connectionManager.serverThreadStart();
try (ServerSocket serverSocket = new ServerSocket(port)) {
acceptNewConnections.set(true);
while (running) {
try {
if (acceptNewConnections.get()) {
final Socket socket = serverSocket.accept();
if (acceptNewConnections.get()) connectionManager.addClient(socket);
else socket.close();
} else {
try {Thread.sleep(10);} catch(InterruptedException e){}
}
} catch (SocketTimeoutException ignored) {
//
}
}
} catch (IOException e) {
//
}
connectionManager.serverThreadStop();
}
}
Мои вопросы:
Есть ли способ прервать ожидание нового сокета, пока ожидание?
Есть ли способ ожидания нового сокета, но он будет принимать его по мере необходимости после ожидания, а не ждать и принимать его одной командой?
Как я могу приостановить поток сервера при блокировке новых подключений без использования Thread.sleep () и бесполезного перегрузки ЦП?
Большое спасибо за помощь.