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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當同一對象運行回調(diào)時重新創(chuàng)建對象的設計模式

當同一對象運行回調(diào)時重新創(chuàng)建對象的設計模式

FFIVE 2023-06-08 20:26:20
這是我正在嘗試做的一個簡單的玩具示例。我有一個實現(xiàn)方法的 WebSocket 類onClose()。當 Socket 關(guān)閉時,它會觸發(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();? }}在父類中,我創(chuàng)建了此類的一個新實例。當套接字關(guān)閉時,我必須重新創(chuàng)建此類的新實例。(舊的不能用)這是我的實現(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(); });? }}此代碼有效但是每當onClose()被觸發(fā)時,一個新的幀就會被添加到堆棧中。WebSocket在不增加堆棧大小的情況下重新創(chuàng)建對象的最佳模式是什么?運行一個不斷檢查套接字狀態(tài)的線程是否是一種可行的方法?IE:while(socket.isOpen()) {?Thread.sleep(1000);}createSocket();
查看完整描述

1 回答

?
30秒到達戰(zhàn)場

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)絡連接幾乎總是一個好主意,因此主線程仍然可用于其他任務。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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