Javaインタフェース非同期呼び出し
1976 ワード
JAvaインタフェース呼び出し呼び出し呼び出し呼び出しは呼び出し方式から3種類に分けることができる:同期呼び出し、非同期呼び出し、コールバック;同期呼び出しは基本的にはもちろん,Aメソッドで直接メソッドBを呼び出し,上から順に実行するブロック式の呼び出しである.今日は非同期呼び出しです.
非同期呼び出しとは?
メソッドAでメソッドBを呼び出すのは理解できますが、メソッドBは時間がかかり、同期呼び出しであればメソッドBの実行が完了してから下に実行されます.非同期であればメソッドBを呼び出し、呼び出しが受け入れられたことを証明する戻り値を与えますが、タスクが完了していません.私は下に実行し続けます.表現が間違っているところがあるかもしれませんが、指摘を歓迎します.
もう一つの生活の例を使いましょう:非同期呼び出しはあなたが友达を呼んで食事をして、あなたの友达は知っていると言って、後で忙しくてあなたを探しに行って、あなたは他のことをします.同期呼び出しはあなたが友达を呼んで食事をして、あなたの友达は忙しくて、あなたはずっとそこで待っていて、あなたの友达が忙しくなったら、あなた达は一緒に行きます.
非同期呼び出しにはどのようなロールがありますか?呼び出し者 出荷証明書 真実データ 1人の呼び出し者は、時間のかかる操作を呼び出し、すぐにデータを返すことができない場合、まず1つの出荷証明書を返し、その後、切断時間が経過した後、出荷証明書によって本当のデータを取得する.
非同期呼び出しの例(以下、http://blog.csdn.net/dlutbruc...)
呼び出し者と実際のデータとの橋渡しは出荷証明書です.まず、public class FutureTicket{private Object data=null;private boolean completed=false;
public synchronized void makeRealData(){if(this.complited)return;//データ取得にかかる時間のかかる操作.ここではtry{Thread.sleep(10000);}catch(Throwable t){}this.data=「返されるデータの内容」;this.completed=true;notifyAll();}
public synchronized Object getData(){ while(!this.completed)){ try{
}catch(Throwable t){} } return this.data;
}public boolean isCompleted(){return this.completed;}}説明を単純化するために(それらの関係を複雑にしない)、ここではObjectbを真実データの代わりに使用する.真実の実装ではmakeDataを真実データのクラスに配置し、真実データを返す方法を提案すべきである.このように真実データの処理と出荷証明書のデカップリングを行う.
この出荷証明書では、呼び出し元の呼び出し方法が非同期呼び出しの鍵となります.publc class Requester{public FutureTicket request(){final FutureTicket ft=new FutureTicket();
//新しいスレッドで時間のかかる操作を呼び出すnew Thread(){public void run(){
}.start();return ft;}}新しいスレッドで時間のかかる操作を開始すると、スレッドの完了を待たずにすぐに納品書に戻る.
そして、呼び出し元はft.isCompleted()に基づいてgetData()を呼び出して実際のデータを取得することができる.もちろんft.isCompleted()テストは所定の時間間隔で巡回することもできるし、条件が満たされない場合にwait()を呼び出し、makeDataのnotifyAll()を待つこともできる.これでJAVAでシミュレーションした非同期操作が完了しました.リンクには後続の改善操作がありますが、本稿では非同期呼び出しとは何かを説明したいだけなので、展示せずに、興味のあるリンクにアクセスできます.
非同期呼び出しとは?
メソッドAでメソッドBを呼び出すのは理解できますが、メソッドBは時間がかかり、同期呼び出しであればメソッドBの実行が完了してから下に実行されます.非同期であればメソッドBを呼び出し、呼び出しが受け入れられたことを証明する戻り値を与えますが、タスクが完了していません.私は下に実行し続けます.表現が間違っているところがあるかもしれませんが、指摘を歓迎します.
もう一つの生活の例を使いましょう:非同期呼び出しはあなたが友达を呼んで食事をして、あなたの友达は知っていると言って、後で忙しくてあなたを探しに行って、あなたは他のことをします.同期呼び出しはあなたが友达を呼んで食事をして、あなたの友达は忙しくて、あなたはずっとそこで待っていて、あなたの友达が忙しくなったら、あなた达は一緒に行きます.
非同期呼び出しにはどのようなロールがありますか?
非同期呼び出しの例(以下、http://blog.csdn.net/dlutbruc...)
呼び出し者と実際のデータとの橋渡しは出荷証明書です.まず、public class FutureTicket{private Object data=null;private boolean completed=false;
public synchronized void makeRealData(){if(this.complited)return;//データ取得にかかる時間のかかる操作.ここではtry{Thread.sleep(10000);}catch(Throwable t){}this.data=「返されるデータの内容」;this.completed=true;notifyAll();}
public synchronized Object getData(){ while(!this.completed)){ try{
wait();
}catch(Throwable t){} } return this.data;
}public boolean isCompleted(){return this.completed;}}説明を単純化するために(それらの関係を複雑にしない)、ここではObjectbを真実データの代わりに使用する.真実の実装ではmakeDataを真実データのクラスに配置し、真実データを返す方法を提案すべきである.このように真実データの処理と出荷証明書のデカップリングを行う.
この出荷証明書では、呼び出し元の呼び出し方法が非同期呼び出しの鍵となります.publc class Requester{public FutureTicket request(){final FutureTicket ft=new FutureTicket();
//新しいスレッドで時間のかかる操作を呼び出すnew Thread(){public void run(){
ft.makeRealData();
}.start();return ft;}}新しいスレッドで時間のかかる操作を開始すると、スレッドの完了を待たずにすぐに納品書に戻る.
そして、呼び出し元はft.isCompleted()に基づいてgetData()を呼び出して実際のデータを取得することができる.もちろんft.isCompleted()テストは所定の時間間隔で巡回することもできるし、条件が満たされない場合にwait()を呼び出し、makeDataのnotifyAll()を待つこともできる.これでJAVAでシミュレーションした非同期操作が完了しました.リンクには後続の改善操作がありますが、本稿では非同期呼び出しとは何かを説明したいだけなので、展示せずに、興味のあるリンクにアクセスできます.