java - 如何在不使用 accept() 的情况下只等待带有 ServerSocket 的新 Socket?
问题描述
我有一个基本的服务器线程,我在其中接受带有 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 过度使用的情况下在阻止新连接的同时暂停服务器线程?
非常感谢您的帮助。
解决方案
推荐阅读
- html - 不使用jQuery,根据其他输入更改输入标签的值
- c# - C#如何为嵌套类实现IEnumerable
- oracle - symfony4/doctrine 与 oracle oci8 db 的问题
- javascript - 通过点击highcharts清除图表
- machine-learning - 在这种情况下,我可以说我的数据很糟糕,并且使用机器学习我将一事无成
- python - 如何使用 pandas 数据框计算每个单元格的百分比并用结果(%)替换 tha 值?
- tsql - TSQL 运行平衡
- python-3.x - 从列表中动态构造一个枚举,该列表可由 Visual Studio Code 自动完成
- sql - 计算 SQL 查询中的嵌套记录
- ios - 如何捕获此错误并表示试图呈现的视图控制器