如何仅使用ServerSocket等待新的套接字而不使用accept()?

时间:2020-04-13 04:22:22

标签: java multithreading sockets serversocket

我有一个基本的服务器线程,其中我使用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()和无用的CPU过度使用而阻塞新连接的同时暂停服务器线程?

非常感谢您的帮助。

0 个答案:

没有答案