1 回答

TA貢獻1828條經(jīng)驗 獲得超6個贊
堆棧溢出的原因是您的回調(diào)永遠不會完成 - 您只需創(chuàng)建一個新套接字并運行它,但舊套接字保持活動狀態(tài)。下一個也一樣,依此類推。
所以處理這個問題的一種方法是同時創(chuàng)建套接字,為方法提供onClose()一種實際終止的方法。
您可以通過將實際創(chuàng)作提交給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);
});
}
}
這樣,當回調(diào)被調(diào)用時onClose(),它會立即返回,并提交了新網(wǎng)絡套接字的創(chuàng)建。該創(chuàng)建尚未發(fā)生,因為執(zhí)行程序是單線程的,并且先前的套接字仍在該線程中運行。但是一旦完成,就會執(zhí)行下一次提交——即剛剛提交的創(chuàng)建。
作為旁注,同時運行網(wǎng)絡連接幾乎總是一個好主意,因此主線程仍然可用于其他任務。
添加回答
舉報