Rumah  >  Artikel  >  Java  >  Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java

Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java

王林
王林ke hadapan
2023-05-04 23:52:051007semak imbas

    Ikhtisar

    Perkhidmatan pengagregatan pembayaran syarikat e-dagang besar semuanya mempunyai senario seperti ini:

    • Panggil perkhidmatan pengesahan untuk mengesahkan sama ada pesanan yang akan dihasilkan adalah sah

    • Perkhidmatan pesanan menjana pesanan (perkhidmatan pengesahan dan perkhidmatan pesanan tidak mempunyai pergantungan )

    • Memanggil 1 dan 2, perkhidmatan pembayaran melaksanakan fungsi teras pembayaran

    • Menggabungkan langkah 1 hingga 3 untuk melengkapkan panggilan pengagregatan bagi perkhidmatan pembayaran

    Jika langkah 1 mengambil masa 5 saat, langkah 2 mengambil masa 3 saat, dan langkah 3 mengambil masa 2 saat, jika anda seorang arkitek, keperluannya ialah:

    1. Sila laksanakan penyegerakan perkhidmatan mikro Panggilan

    2 Sila laksanakan panggilan tak segerak bagi perkhidmatan mikro (dilaksanakan menggunakan CompletableFuture)

    Bandingkan prestasi 1 dan 2.

    Panggilan segerak dan panggilan tak segerak

    Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java

    Rajah kelas masa hadapan

    Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java

    Keburukan Masa Depan

    Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java

    Masa hadapan mempunyai banyak ungkapan langsung Terdapat kelemahan tertentu dalam pergantungan antara keputusan Masa Depan:

    1 Gabungkan dua pengiraan tak segerak menjadi satu (pengiraan tak segerak kedua bergantung pada hasil yang pertama tidak mudah digunakan Masa Depan Mudah dilaksanakan

    2. Tunggu semua tugasan dalam koleksi Masa Depan selesai

    Hanya tunggu tugasan terpantas siap dalam koleksi Masa Depan untuk diselesaikan dan dikembalikan. hasilnya

    Kod

    Alamat kod

    https://gitee.com/zjvngvn/mutil-thread

    Ujian

    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;
        }
    }

    Atas ialah kandungan terperinci Bagaimana untuk menala prestasi panggilan tak segerak berbilang benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam