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.
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
https://gitee.com/zjvngvn/mutil-thread
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"); } }
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; } }
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; } }
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!