第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

當(dāng)同一對(duì)象運(yùn)行回調(diào)時(shí)重新創(chuàng)建對(duì)象的設(shè)計(jì)模式

當(dāng)同一對(duì)象運(yùn)行回調(diào)時(shí)重新創(chuàng)建對(duì)象的設(shè)計(jì)模式

FFIVE 2023-06-08 20:26:20
這是我正在嘗試做的一個(gè)簡(jiǎn)單的玩具示例。我有一個(gè)實(shí)現(xiàn)方法的 WebSocket 類(lèi)onClose()。當(dāng) Socket 關(guān)閉時(shí),它會(huì)觸發(fā)事件處理程序(lambda 函數(shù))。public class WebSocket {? ICallback cb;? public WebSocket(ICallback cb) {? ? ? this.cb = cb;? ? ? this.onClose(); // Simulating socket closing? }? public void onClose() {? ? this.cb.handle();? }? @FunctionalInterface? public static interface ICallback {? ? public abstract void handle();? }}在父類(lèi)中,我創(chuàng)建了此類(lèi)的一個(gè)新實(shí)例。當(dāng)套接字關(guān)閉時(shí),我必須重新創(chuàng)建此類(lèi)的新實(shí)例。(舊的不能用)這是我的實(shí)現(xiàn)class Parent {? static WebSocket socket;? public static void main(String[] args) {? ? Parent.createSocket();? }? public static void createSocket() {? ? Parent.socket = new WebSocket(() -> { Parent.createSocket(); });? }}此代碼有效但是每當(dāng)onClose()被觸發(fā)時(shí),一個(gè)新的幀就會(huì)被添加到堆棧中。WebSocket在不增加堆棧大小的情況下重新創(chuàng)建對(duì)象的最佳模式是什么?運(yùn)行一個(gè)不斷檢查套接字狀態(tài)的線程是否是一種可行的方法?IE:while(socket.isOpen()) {?Thread.sleep(1000);}createSocket();
查看完整描述

1 回答

?
30秒到達(dá)戰(zhàn)場(chǎng)

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ù)。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
  • 1 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)