5种必会的Java异步调用转同步的方法你会几种?
异步和同步的理解:
同步调用:调用方在调用过程中,持续等待返回结果。
异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。
Java如何将异步调用转为同步。
换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。
先列出五种方法,然后一一举例说明:
1)、使用wait和notify方法
2)、使用条件锁
3)、Future
4)、使用CountDownLatch
5)、使用CyclicBarrier
0.构造一个异步调用
构造一个异步调用模型。
异步调用类:
public class AsyncCall {
private Random random = new Random(System.currentTimeMillis());
private ExecutorService tp = Executors.newSingleThreadExecutor();
//demo1,2,4,5调用方法
public void call(BaseDemo demo){
new Thread(()->{
long res = random.nextInt(10);
try {
Thread.sleep(res*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
demo.callback(res);
}).start();
}
//demo3调用方法
public Future<Long> futureCall(){
return tp.submit(()-> {
long res = random.nextInt(10);
try {
Thread.sleep(res*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return res;
});
}
public void shutdown(){
tp.shutdown();
}
}
我们主要关心call方法,这个方法接收了一个demo参数,并且开启了一个线程,在线程中执行具体的任务,
并利用demo的callback方法进行回调函数的调用。
大家注意到了这里的返回结果就是一个[0,10)的长整型,
并且结果是几,就让线程sleep多久——这主要是为了更好地观察实验结果,模拟异步调用过程中的处理时间。
至于futureCall和shutdown方法,以及线程池tp都是为了demo3利用Future来实现做准备的。
dem