Java 非同期待機

PHPz
リリース: 2024-08-30 15:10:03
オリジナル
1059 人が閲覧しました

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");
}
ログイン後にコピー

Java では async-await 関数はどのように動作しますか?

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);
}
ログイン後にコピー

Java 非同期待機の例

このセクションでは、async と await の細かい点がどのように機能するかを見ていきます。

例 #1

コード:

import 'dart:async';
void main() async {
var a = await ten();
print(a);
}
Future<int> ten() async {
return 10;
}
ログイン後にコピー

説明

上記のコードは、将来の Java 7 バージョン API を使用し、10 を表示するまで 10 秒待機します。

出力:

Java 非同期待機

例 #2

コード:

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");
}
}
ログイン後にコピー

説明

他のスレッドがタスクを処理している間に、値が合計されます。

出力:

Java 非同期待機

例 #3

コード:

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() 関数で同期タスクを停止します。したがって、出力は次のようになります:

出力:

Java 非同期待機

例 #4 – 時間の秒

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 秒待機します。

出力:

Java 非同期待機

結論

最後に、非同期コードを書くのは少し難しくなります。そして最も重要なことは、Promise は遅延実行のフローを定義する一般的な方法です。この記事では、同期のように見える非同期コードを作成する方法を学びました。複雑なコードでは、非同期の使用がより重要になっています。 JavaScript 開発者は、この概念についてよく理解しておく必要があります。

以上がJava 非同期待機の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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