Как только ждать нового Socket с ServerSocket без использования accept ()? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть основной серверный поток 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 () и бесполезного перегрузки ЦП?

Большое спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...