Java 非同期待機は、I/O バウンド操作を実行するものとして定義されており、アプリケーションの応答性は必要ありません。これらの関数は、操作の完了時に実行されるコールバックを必要とするため、通常、ファイル操作やネットワーク操作で使用されます。また、この関数は常に値を返します。 awake キーワードを使用すると、非同期呼び出しは通常の制御フロー ステートメント内で使用され、ノンブロッキング コードになります。このトピックでは、Java async await について学習します。
広告 このカテゴリーの人気コース JAVA マスタリー - スペシャライゼーション | 78 コース シリーズ | 15 回の模擬テスト無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
構文
async / await の一般的な署名は次のように与えられます
async void test() { print('Welcome to EDUCBA'); }
待機は次のように続きます
const test=async() => { await test (); Print ("completed"); }
Async awaits 関数は、コードの背後で非同期タスクを実行しながら同期コードを作成するのに役立ちます。そして、async キーワードが必要です。次は、非同期コードを通常どおり実行し、コードの次の行に進むという待機部分です。新しい演算子「Await」は、非同期関数内で使用されると、実行中のプロセスを解決する約束を自動的に待ちます。ただし、それ以外の場合に使用すると構文エラーが発生します。
関数がエラー処理でエラーをスローした場合、async 関数の Promise は拒否されます。それぞれの関数がたまたま値を返した場合、Promise は解決されます。このノンブロッキング コードは別のスレッドで実行され、タスクの完了または失敗をメイン スレッドに通知します。 Try-catch は、エラーを同期的に処理する関数で使用されます。
のように始まるサンプルを見てみましょうasync function hello() { //process waiting await new Promise(res => setTimeout(res, 2000)); // Rejection with 20 % if (Math.random() > 0.2) { throw new Error('Check the number.') } return 'number'; }
上記のコードは、関数 hello() が非同期であることを示しており、数値を返すことで問題を解決し、数値をチェックすることでエラーをスローします。
次に、await と return を一緒に使用してプロセスを一時停止します
async function miss() { try { return await hello(); } catch (e) { return 'error caught'; } }
この関数によるより有望な連鎖は次のように与えられます
async function promise1( req,res) { try { let a=await a.get(req,uid); let b=await cart.get (yser,uid); Res.send(await dosome(a,cart)); } catch (err) { res.send(err); } }
ここで await キーワードは、関数 get() がエラーをキャッチする前に完了するように指示しています。
この Completable future では、future オブジェクトを返します。この Completable future は非同期計算への参照であり、future を実装します。
private static CompletableFuture<Void> hello{ try { String intermediate = await(doA()); String res = await(doB(intermediate)); reportSuccess(res); } catch (Throwable th) { reportFailure(th); } return completedFuture(null); }
このセクションでは、async と await の細かい点がどのように機能するかを見ていきます。
コード:
import 'dart:async'; void main() async { var a = await ten(); print(a); } Future<int> ten() async { return 10; }
説明
上記のコードは、将来の Java 7 バージョン API を使用し、10 を表示するまで 10 秒待機します。
出力:
コード:
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; class Comput1 implements Runnable { public static int item = 0; public void run() { item = 3 * 3; try { CyclicBarrierAwaitExample2.newBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } } class Comput2 implements Runnable { public static int total = 0; public void run() { // check if newBarrier is broken or not System.out.println("Is it broken? - " + CyclicBarrierAwaitExample2.newBarrier.isBroken()); total = 20 + 20; try { CyclicBarrierAwaitExample2.newBarrier.await(2000, TimeUnit.MILLISECONDS); System.out.println("Number of rooms waiting at the barrier "+ "here = " + CyclicBarrierAwaitExample2.newBarrier.getNumberWaiting()); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } } public class CyclicBarrierAwaitExample2 implements Runnable { public static CyclicBarrier newBarrier = new CyclicBarrier(3); public static void main(String[] args) { CyclicBarrierAwaitExample2 test = new CyclicBarrierAwaitExample2(); Thread t = new Thread(test); t.start(); } @Override public void run() { System.out.println("Number of parties required to trip the barrier = "+ newBarrier.getParties()); System.out.println("Sum of product and sum = " + (Comput1.item + Comput2.total)); Comput1 comp1 = new Comput1(); Comput2 comp2 = new Comput2(); Thread t = new Thread(comp1); Thread t2 = new Thread(comp2); t.start(); t2.start(); TimeUnit unit = TimeUnit.SECONDS; try { CyclicBarrierAwaitExample2.newBarrier.await(1,unit); } catch (InterruptedException | BrokenBarrierException | TimeoutException e) { e.printStackTrace(); } System.out.println("Sum of item and total = " + (Comput1.item + Comput2.total)); newBarrier.reset(); System.out.println(" reset successful"); } }
説明
他のスレッドがタスクを処理している間に、値が合計されます。
出力:
コード:
import java.util.*; import java.util.concurrent.*; public class Async { static List<Task> tasks = new ArrayList<>(); static ExecutorService executor = Executors.newScheduledThreadPool(3); public static void main(String[] args) { createTasks(); executeTasks(); } private static void createTasks() { for (int k= 0; k < 10; k++) { tasks.add(new Task(k)); } } private static void executeTasks() { for (Task task : tasks) { executor.submit(task); } } static class Task extends Thread { int n; public void run() { try { Thread.sleep(new Random (). nextInt (1000)); } catch (InterruptedException e) { e.printStackTrace(); } printNum(); } private void printNum() { System.out.print(n + " "); } public Task(int n) { this.n = n; } } }
説明
上記のコードは、スレッド値、つまりワーカー スレッドを割り当てることでタスクを開始します。ここでは、print numb() 関数で同期タスクを停止します。したがって、出力は次のようになります:
出力:
Async.html
<html> <meta charset="utf-8"/> <body> Understanding JavaScript Program Execution</br> <script type="text/javascript"> function tensec() { return new Promise((resolve,reject)=>{ setTimeout(() => { console.log('EDUCBA PAge -I take 20 second'); resolve(); }, 10000); }); } async function run() { console.log('EDUCBA PAge : Page executed immediately'); await tensec(); console.log('EDUCBA PAge : Next process'); } run(); </script> </body> </html>
説明
上記のコードは、その Promise を実行し、async-await を使用して待機時間間隔を表示します。たとえば、上記のスクリプトはタスクが完了するまで 20 秒待機します。
出力:
最後に、非同期コードを書くのは少し難しくなります。そして最も重要なことは、Promise は遅延実行のフローを定義する一般的な方法です。この記事では、同期のように見える非同期コードを作成する方法を学びました。複雑なコードでは、非同期の使用がより重要になっています。 JavaScript 開発者は、この概念についてよく理解しておく必要があります。
以上がJava 非同期待機の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。