前提概要
在知乎上看到一道Java多线程
的笔试题,心想我多线程只会Thread
和Runable
,在写WebFluxTest
用过一次CountDownLatch
,除此之外还没怎么去看cocurrent
包下的类,所以就想试试。
题目
知乎传送门:某大型电商Java面试题:一主多从多线程协作
客户请求下单服务(OrderService),服务端会验证用户的身份(RemotePassportService),用户的银行信用(RemoteBankService),用户的贷款记录(RemoteLoanService)。为提高并发效率,要求三项服务验证工作同时进行,如其中任意一项验证失败,则立即返回失败,否则等待所有验证结束,成功返回
。要求Java实现。
原解法反思
知乎中使用CountDownLatch
解决了这个问题,不过CountDownLatch
本来就是用来解决异步转同步
问题的,不过作者给的代码还是感觉不太优雅
,评论中提到了Future
这个类,所以我就以Future
为起点开始了探索。
探索Future
那么一开始,我肯定是去找找Future
这个类啦,然后就查到类的类定义。
public interface Future<V>{
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get();
V get(long timeout, TimeUnit unit)
}
这样一看,原来只是一个接口,不过确实使用这个接口会是一个不错的选择,类似Callable
的升级版,可以定义返回值
,更重要是有cancel
方法,那么终止进程
的方法就有了。
Future有一个实现类:FutureTask
,他同时实现了Future
和Runable
两个接口,然后有两个构造方法:
public FutureTask(Runnable runnable, V result)
public FutureTask(Callable<V> callable)
因为用来管理多线程的ThreadPoolExecutor
只能execute
实现Runable
的类,所以到这里已经有个大概的思路了,那么就开始撸代码。
思路
ThreadPoolExecutor
说到多线程,那么肯定得要ThreadPoolExecutor
来管理多线程