0

我有一个 Shipment 对象的列表,我需要调用 API 来获取有关每个 Shipment 的一些信息。我正在尝试并行进行这些网络调用。所以我正在使用 Java 8parallelStream()并将其提交给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
}

我有两个问题:

  1. 我想优化我的线程数ForkJoinPool,所以我需要检查它的执行情况。如果请求没有被池立即处理和处理,我是否可以记录?
  2. 我的系统流量很大。因此,如果我执行 a submit()and get()on an autowired ForkJoinPool,我的代码会等待来自不同请求的 Shipments 吗?我的意思是,假设我同时收到 2 个请求。Request1 有 3 个 Shipments 与之关联,Request2 有 5 个 Shipments。那么上面的代码会等到所有 8 次发货完成吗?

谢谢。

4

1 回答 1

0

我想优化我的 ForkJoinPool 中的线程数,所以我需要检查它的执行情况。如果请求没有被池立即处理和处理,我是否可以记录?

您可以通过ForkJoinPool.hasQueuedSubmissions(). 因此,如果它返回 true - 请求不会立即被占用和处理。即使没问题,您也可能会抓住这样的时刻,因此您可以仔细检查队列大小是否很小ForkJoinPool.getQueuedSubmissionCount()(注意它具有 O(n) 时间复杂度,其中 n 是排队提交的数量)。

我的系统流量很大。因此,如果我在自动装配的 ForkJoinPool 上执行 submit() 和 get(),我的代码会等待来自不同请求的 Shipments 吗?我的意思是,假设我同时收到 2 个请求。Request1 有 3 个 Shipments 与之关联,Request2 有 5 个 Shipments。那么上面的代码会等到所有 8 次发货完成吗?

是的,它将等到所有 8 批货物都完成。根据池和队列大小,在最好的情况下,它所花费的时间与最长的 Shipment 处理所用的时间大致相同。

于 2017-05-26T12:22:17.507 回答