一、異步概念
Java是一門面向對象編程語言,對於一個對象或一個方法,如果它需要執行一個比較長的操作可能會阻塞程序,導致程序變慢,用戶體驗不好。這時我們就需要將這個操作放到另一個線程中去執行,讓主程序繼續執行下面的邏輯代碼,這樣就可以實現多線程異步執行。異步執行是一種對資源佔用率比較低,提高程序運行效率的方式。
二、Future 異步
Future 是 Java 中並發包里的一個類,可以用來實現異步回調。Future 的特點是,執行 Future.get() 方法時,如果異步操作已經完成,就直接返回結果;如果異步操作沒有完成,那麼它會等待操作完成再返回結果。
import java.util.concurrent.*; public class FutureDemo { public static void main(String[] args) throws Exception { ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future future = threadPool.submit(() -> { // 模擬異步操作 Thread.sleep(1000); return 100; }); Integer result = future.get(); System.out.println(result); threadPool.shutdown(); } }
三、CompletableFuture 異步
CompletableFuture 是 Java 8 中新增的異步操作類,是對 Future 的增強,支持異步回調、回滾、組合等操作。它的異步任務可以自由地與其他任務組合執行。
import java.util.concurrent.CompletableFuture; public class CompletableFutureDemo { public static void main(String[] args) throws Exception { CompletableFuture future = CompletableFuture.supplyAsync(() -> { // 模擬異步操作 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return 100; }); future.thenAccept((result) -> { System.out.println(result); }); // 阻塞等待異步任務執行完成 future.join(); } }
四、回調函數 Callback
回調函數是指我們預先定義一個方法,然後將這個方法傳給異步任務執行,異步任務執行完成後再執行我們預先定義好的回調方法。
public class CallbackDemo { public static void main(String[] args) throws Exception { asyncMethod((result) -> { System.out.println(result); }); System.out.println("Main Thread End..."); } private static void asyncMethod(Callback callback) { new Thread(() -> { // 模擬異步操作 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } callback.onFinish(100); }).start(); } } interface Callback { void onFinish(Integer result); }
五、CompletableFuture 組合異步
CompletableFuture 可以與其他 CompletableFuture 對象進行組合異步操作,實現更加複雜的異步操作。
import java.util.concurrent.CompletableFuture; public class CompletableFutureComposeDemo { public static void main(String[] args) throws Exception { CompletableFuture future1 = CompletableFuture.supplyAsync(() -> { // 模擬異步操作 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return 100; }); CompletableFuture future2 = CompletableFuture.supplyAsync(() -> { // 模擬異步操作 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello"; }); CompletableFuture future3 = future1.thenCompose((result) -> { return CompletableFuture.supplyAsync(() -> { return result + " World"; }); }); CompletableFuture future4 = future2.thenCombine(future3, (result1, result2) -> { return result1 + " " + result2; }); future4.thenAccept((result) -> { System.out.println(result); }); future4.join(); } }
原創文章,作者:EUQGW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/368108.html