Java 非同期コールバック メカニズム

伊谢尔伦
リリース: 2016-12-05 11:51:45
オリジナル
1245 人が閲覧しました

1. コールバックとは何ですか?呼び出し元と呼び出し先の間でコールバックが行われる前に、まず呼び出しが必要です。 Baidu Encyclopedia では次のようになります。

ソフトウェア モジュール間には、メソッドの呼び出しに関して、同期呼び出し、コールバック、非同期呼び出しの 3 つのカテゴリに分けられます。

コールバックは特別な種類の呼び出しであり、3 つのメソッドは少し異なります。


1. 同期コールバック、つまり、一方向のブロッキング。

2. コールバック、つまり双方向 (自転車の 2 つのギアに似ています)。

3. 非同期呼び出し、つまり、非同期メッセージによる通知。

2. CS での非同期コールバック (Java の場合)

たとえば、これはシミュレートされたシナリオです: クライアントはサーバーにメッセージを送信し、サーバーがそれを処理した後 (5 秒)、クライアントにコールバックして通知します。処理が成功したことをクライアントに通知します。コードは次のとおりです。

コールバック インターフェイス クラス:

public interface CSCallBack {
    public void process(String status);
}
ログイン後にコピー

シミュレートされたクライアント:

public class Client implements CSCallBack {

    private Server server;    
      public Client(Server server) {        
      this.server = server;
    }    
      public void sendMsg(final String msg){
        System.out.println("客户端:发送的消息为:" + msg);        
             new Thread(new Runnable() {            
             @Override
            public void run() {
                server.getClientMsg(Client.this,msg);
            }
        }).start();
        System.out.println("客户端:异步发送成功");
    }    
             @Override
    public void process(String status) {
        System.out.println("客户端:服务端回调状态为:" + status);
    }
}
ログイン後にコピー

シミュレートされたサーバー:

public class Server {
    public void getClientMsg(CSCallBack csCallBack , String msg) {
        System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg);        
        // 模拟服务端需要对数据处理
        try {
            Thread.sleep(5 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("服务端:数据处理成功,返回成功状态 200");
        String status = "200";
        csCallBack.process(status);
    }
}
ログイン後にコピー

テスト クラス:

public class CallBackTest {
    public static void main(String[] args) {
        Server server = new Server();
        Client client = new Client(server);
        client.sendMsg("Server,Hello~");
    }
}
ログイン後にコピー

テスト クラスを実行します。出力される結果は次のとおりです。コードをステップごとに説明します。核となる概要は次のとおりです

客户端:发送的消息为:Server,Hello~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态 200客户端:服务端回调状态为:200
ログイン後にコピー

3. コールバックのアプリケーション シナリオ

現在、コールバックはどのようなシナリオでより頻繁に使用されていますか?オペレーティング システムから開発者への呼び出し:

1、接口作为方法参数,其实际传入引用指向的是实现类
2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。
ログイン後にコピー

追加: フィルターとインターセプターの違いは、インターセプターは Java のリフレクション メカニズムに基づいており、コンテナとは何の関係もないことです。ただし、コールバック メカニズムと同じ目的があります。

つまり、この設計により、基礎となるコードが上位レベル (実装層) によって定義されたサブルーチンを呼び出すことができるようになり、プログラムの柔軟性が向上します。

4. モードの比較

上で述べたように、Filter と Intercepter は同じ目的を持っています。実際、インターフェイスのコールバック メカニズムもデザイン パターンに似ています。オブザーバー パターン:

オブザーバー パターン:

GOF は、「オブジェクトの 1 対多の依存関係を定義します。オブジェクトの状態が変化したとき」と述べています。このとき、それに依存するすべてのオブジェクトに通知および更新が行われます。これは、インターフェイスのコールバック メソッドを通じて実装されるパターン、つまりコールバックの表現です。

インターフェイス コールバック:

とオブザーバー パターンの違いは、これが特定の実装ではなく原則であることです。

5. 体験

4 つのステップのまとめ:

メカニズムが原理です。

パターンは現れます。

特定のシナリオと一般的なパターンを覚えてください。

次に、原則を深く理解します。





関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!