4

自己完結型にしたいTCPサーバークラスを書いています。つまり、このクラスを使用するアプリケーションは、内部ワーカー スレッドを気にする必要はありません。TCP サーバー クラスには start() メソッドがあり、start() を呼び出したのと同じスレッド (通常の使用ではメイン スレッド) でリスナーのメソッドを呼び出せるようにしたいと考えています。これはおそらくコードでよりよく説明されています:

public class ProblemExample {
    private Listener mListener;

    public ProblemExample() {
        mListener = new Listener() {
            @Override
            public void fireListener() {
                System.out.println(Thread.currentThread().getName());
            }
        };
    }

    public void start() {
        mListener.fireListener(); // "main" is printed
        new Thread(new Worker()).start();
    }

    public interface Listener {
        public void fireListener();
    }

    private class Worker implements Runnable {
        @Override
        public void run() {
            /* Assuming the listener is being used for status updates while
             * the thread is running, I'd like to fire the listener on the
             * same thread that called start(). Essentially, the thread that
             * starts the operation doesn't need to know or care about the
             * internal thread. */
            mListener.fireListener(); // "Thread-0" is printed
        }
    }
}

これを検索しようとしましたが、何を検索すればよいかわかりません。私が見つけた最良の方法は、SwingWorkerがこれを行うように見えることですが、方法がわかりません。

誰でも光を当てることができますか?

4

1 に答える 1

1

あなたが求めていることは、クライアント スレッド (を呼び出したスレッド) からの明示的な協力なしでは理論的に不可能start()です。立ち止まって考えてみてください。メイン スレッドは常に、特定のメソッドで特定のコードを実行するのに忙しいのです。完全な呼び出しスタックは、現在の呼び出し専用です。ここで、それを中断して、突然リスナー コードの実行を開始したいと考えています。

Swing がこれを実現する方法は、イベント ディスパッチ スレッドでメイン イベント ループを実行することです。このループでは、インスタンスがRunnableキューから取り出され、それらのrunメソッドが順番に呼び出されることを想像できます。run1 つのメソッドが戻ったときにのみ、次のメソッドを呼び出すことができます。

これはあなたの場合にも設計する必要があるものですが、そのようなことを念頭に置いていたかどうかはわかりません. 唯一の代替手段は、外部スレッドで実行されるリスナー メソッドを明示的にサポートすることです。

于 2012-12-14T09:28:25.843 に答える