Java 비동기 대기는 I/O 바인딩 작업을 수행하는 것으로 정의되며 애플리케이션 응답이 필요하지 않습니다. 이러한 함수는 작업 완료 시 실행되는 콜백이 필요하므로 일반적으로 파일 및 네트워크 작업에 사용됩니다. 또한 이 함수는 항상 값을 반환합니다. awake 키워드를 사용하면 일반 제어 흐름 문 내에서 비동기 호출이 사용되며 이는 비차단 코드입니다. 이번 주제에서는 Java async Wait에 대해 알아보겠습니다.
광고 이 카테고리에서 인기 있는 강좌 JAVA MASTERY - 전문 분야 | 78 코스 시리즈 | 15가지 모의고사무료 소프트웨어 개발 과정 시작
웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등
구문
async/await의 일반적인 서명은 다음과 같습니다.
async void test() { print('Welcome to EDUCBA'); }
기다림은 계속됩니다
const test=async() => { await test (); Print ("completed"); }
비동기 대기 기능은 코드 뒤에서 비동기 작업을 수행하는 동안 동기 코드를 작성하는 데 도움이 됩니다. 그리고 async 키워드가 필요합니다. 그리고 다음은 비동기 코드를 정상적으로 실행하고 다음 코드 줄로 진행하라는 기다리고 있는 부분입니다. 새로운 연산자 "Await"는 비동기 함수 내에서 사용될 때 실행 중인 프로세스를 해결하기 위한 약속을 자동으로 기다립니다. 그러나 다른 경우에 사용하면 구문 오류가 발생합니다.
오류 처리 중 오류가 발생하면 비동기 함수의 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() 함수가 비동기식이라고 말하고 숫자를 반환하여 이를 해결하고 숫자를 확인하여 오류를 발생시킵니다.
다음으로, wait와 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); } }
여기서 wait 키워드는 오류를 잡기 전에 get() 함수가 완료되도록 지시합니다.
이 Completable future를 사용하면 future 객체를 반환합니다. 이 Completable 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 및 Wait의 세부적인 사항이 어떻게 작동하는지 살펴보겠습니다.
코드:
import 'dart:async'; void main() async { var a = await ten(); print(a); } Future<int> ten() async { return 10; }
설명
위 코드는 Java 7 버전 API인 future를 사용하고 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>
설명
위 코드는 약속을 실행하고 async-await의 도움으로 대기 시간 간격을 표시합니다. 예를 들어 위 스크립트는 작업이 완료될 때까지 20초 동안 기다립니다.
출력:
마지막에는 비동기 코드 작성이 조금 더 어렵고, 가장 중요한 것은 약속이 지연된 실행 흐름을 정의하는 일반적인 방법이라는 것입니다. 이 기사에서는 동기처럼 보이는 비동기 코드를 작성하는 방법을 배웠습니다. 복잡한 코드에서는 비동기를 사용하는 것이 더 중요했습니다. JavaScript 개발자는 이 개념을 많이 이해해야 합니다.
위 내용은 자바 비동기 대기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!