Java 检查是否立即处理提交给自定义ForkJoinPool的请求
我有一个装运对象的列表,我需要进行API调用以获取关于每个装运的一些信息。我正在尝试并行地进行这些网络调用。因此,我正在使用Java 8Java 检查是否立即处理提交给自定义ForkJoinPool的请求,java,multithreading,spring-boot,forkjoinpool,Java,Multithreading,Spring Boot,Forkjoinpool,我有一个装运对象的列表,我需要进行API调用以获取关于每个装运的一些信息。我正在尝试并行地进行这些网络调用。因此,我正在使用Java 8parallelStream()并将其提交到自定义的ForkJoinPool,如下所示: @Autowired ForkJoinPool forkJoinPool; ... public void someMethod(){ ... List<MyObj> myObjList = null; try { myO
parallelStream()
并将其提交到自定义的ForkJoinPool
,如下所示:
@Autowired
ForkJoinPool forkJoinPool;
...
public void someMethod(){
...
List<MyObj> myObjList = null;
try {
myObjList = forkJoinPool.submit(() -> shipmentList.parallelStream()
.map(shipment -> getShipmentInfo(shipment))
.collect(Collectors.toList())
).get();
} catch (Exception e){
...
}
}
public MyObj getShipmentInfo(Shipment shipment) {
// Make network call and return MyObj
}
@Autowired
ForkJoinPool ForkJoinPool;
...
公共方法(){
...
列表myObjList=null;
试一试{
myObjList=forkJoinPool.submit(()->shipmentList.parallelStream()
.map(发货->getShipmentInfo(发货))
.collect(收集器.toList())
).get();
}捕获(例外e){
...
}
}
公共MyObj getShipmentInfo(装运){
//拨打网络电话并返回MyObj
}
我有两个问题:
ForkJoinPool
中的线程数量,因此我需要检查它的执行情况。如果池没有立即处理请求,我是否可以记录日志自动连接的ForkJoinPool
上执行submit()
和get()
,我的代码是否会等待来自不同请求的发货?我的意思是,假设我同时收到两个请求。Request1有3个与之关联的装运,Request2有5个装运。那么,上述代码是否会一直等到所有8次发货完成ForkJoinPool.hasQueuedSubmissions()
预先定期检查提交队列是否为空。因此,如果返回true,则不会立即处理请求。即使没有问题,您也可能会抓住这一时刻,因此可以使用ForkJoinPool.getQueuedSubmissionCount()
(注意,它的时间复杂度为O(n),其中n是排队提交的数量)
我的系统流量很大。所以,如果我在一个自动连接的ForkJoinPool上执行submit()和get(),我的代码是否会等待来自不同请求的发货?我的意思是,假设我同时收到两个请求。Request1有3个与之关联的装运,Request2有5个装运。那么,上述代码是否会一直等到所有8次发货完成
是的,要等到8批货全部完成。根据池和队列大小,在最佳情况下,所需时间与最长装运处理所用时间大致相同