亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

當同一對象運行回調時重新創建對象的設計模式

當同一對象運行回調時重新創建對象的設計模式

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

1 回答

?
30秒到達戰場

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(),它會立即返回,并提交了新網絡套接字的創建。該創建尚未發生,因為執行程序是單線程的,并且先前的套接字仍在該線程中運行。但是一旦完成,就會執行下一次提交——即剛剛提交的創建。


作為旁注,同時運行網絡連接幾乎總是一個好主意,因此主線程仍然可用于其他任務。


查看完整回答
反對 回復 2023-06-08
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號