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(),它會立即返回,并提交了新網絡套接字的創建。該創建尚未發生,因為執行程序是單線程的,并且先前的套接字仍在該線程中運行。但是一旦完成,就會執行下一次提交——即剛剛提交的創建。
作為旁注,同時運行網絡連接幾乎總是一個好主意,因此主線程仍然可用于其他任務。
添加回答
舉報