一、异步概念
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/n/368108.html
微信扫一扫
支付宝扫一扫