>  기사  >  Java  >  Java 다중 스레드 비동기 호출의 성능을 조정하는 방법

Java 다중 스레드 비동기 호출의 성능을 조정하는 방법

王林
王林앞으로
2023-05-04 23:52:051054검색

    개요

    대규모 전자상거래 회사의 결제 집계 서비스에는 모두 다음과 같은 시나리오가 있습니다.

    • 생성될 주문이 합법적인지 확인하기 위해 확인 서비스를 호출합니다

    • The 주문 서비스가 주문을 생성합니다(검증 서비스와 주문 서비스 사이에 종속성이 없습니다)

    • 1번과 2번을 호출하면 결제 서비스가 결제 핵심 기능을 구현합니다

    • 1~3단계를 결합하여 집계를 완료합니다. 결제 서비스 호출

    1단계 소비가 5초, 2단계 3초, 3단계 소비가 2초라면 요구 사항은 다음과 같습니다.

    1. 마이크로 서비스의 호출 os2. 마이크로 서비스의 비동기 통화 (완전한 충전을 사용하여 구현)

    chenchronous 통화 및 비동기 호출 aidfuture 클래스 다이어그램의 성능. Future

    Future는 여러 Future 결과 중 하나를 직접 표현합니다. 둘 사이의 종속성은 특정 결함이 있습니다.

    Java 다중 스레드 비동기 호출의 성능을 조정하는 방법1. 두 개의 비동기 계산을 하나로 병합합니다(두 번째 비동기 계산은 첫 번째 결과에 따라 다름).

    2. Wait Future 컬렉션의 모든 작업이 완료되었습니다

    Future 컬렉션에서 가장 빠르게 종료되는 작업만 완료하고 결과를 반환합니다Java 다중 스레드 비동기 호출의 성능을 조정하는 방법

    Code

    코드 주소

    Java 다중 스레드 비동기 호출의 성능을 조정하는 방법https:/ /gitee.com/zjvngvn/mutil-thread

    Test

    public class Test {
        public static void main(String[] args) {
        	// 同步调用
            long start1 = System.currentTimeMillis();
            PaymentService.syncPay();
            System.out.println("同步支付耗时:" + (System.currentTimeMillis() - start1)+" ms");
            System.out.println("=========================");
            // 异步调用
            long start2 = System.currentTimeMillis();
            PaymentService.asyncPay();
            System.out.println("异步支付耗时:" + (System.currentTimeMillis() - start2)+" ms");
        }
    }

    PaymentService

    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.TimeUnit;
    public class PaymentService {
        /**
         * 异步支付的入口方法
         *
         * @return
         */
        public static boolean asyncPay() {
            //校验
            CompletableFuture<Boolean> isValid = CompletableFuture.supplyAsync(() -> CheckService.isValid());
            //创建订单
            CompletableFuture<Integer> orderSum = CompletableFuture.supplyAsync(() -> OrderService.createOrder());
            //支付
            CompletableFuture<Integer> money = CompletableFuture.supplyAsync(() -> basePay());
            // 上面三个都完成之后,再进行下面匿名内部类的代码
            CompletableFuture.allOf(isValid, orderSum, money)
                    .thenRun(() -> System.out.println("完成异步支付"))
                    .join();
            return true;
        }
        /**
         * 同步支付的入口方法
         *
         * @return
         */
        public static boolean syncPay() {
            CheckService.isValid();
            OrderService.createOrder();
            basePay();
            System.out.println("同步支付成功");
            //假设支付成功
            return true;
        }
        public static int basePay() {
            int money = 1000;
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("支付");
            //假设支付成功
            return money;
        }
    }

    CheckService

    import java.util.concurrent.TimeUnit;
    public class CheckService {
    	/**
    	 * 返回true说明订单流程才会往下走
    	 */
        public static boolean isValid() {
            System.out.println("订单生成前,检验订单是否合法" );
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //假设订单合法,通过校验
            return true;
        }
    }

    OrderService

    import java.util.concurrent.TimeUnit;
    public class OrderService {
        public static int createOrder() {
            int orderSum=1;
            System.out.println("生成订单" );
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //假设订单数量为1
            return orderSum;
        }
    }

    위 내용은 Java 다중 스레드 비동기 호출의 성능을 조정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제