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