1 回答
TA贡献1828条经验 获得超6个赞
堆栈溢出的原因是您的回调永远不会完成 - 您只需创建一个新套接字并运行它,但旧套接字保持活动状态。下一个也一样,依此类推。
所以处理这个问题的一种方法是同时创建套接字,为方法提供onClose()一种实际终止的方法。
您可以通过将实际创作提交给ExecutorService; 单线程的很好,因为毕竟,您只希望在给定时间运行一个套接字。
class Parent {
static WebSocket socket;
// this is where the socket runs
private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();
public static void main(String[] args) {
createSocket();
}
private static void createSocket() {
Parent.socket = new WebSocket(() -> {
EXECUTOR.submit(Parent::createSocket);
});
}
}
这样,当回调被调用时onClose(),它会立即返回,并提交了新网络套接字的创建。该创建尚未发生,因为执行程序是单线程的,并且先前的套接字仍在该线程中运行。但是一旦完成,就会执行下一次提交——即刚刚提交的创建。
作为旁注,同时运行网络连接几乎总是一个好主意,因此主线程仍然可用于其他任务。
添加回答
举报