Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查是否立即处理提交给自定义ForkJoinPool的请求_Java_Multithreading_Spring Boot_Forkjoinpool - Fatal编程技术网

Java 检查是否立即处理提交给自定义ForkJoinPool的请求

Java 检查是否立即处理提交给自定义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

我有一个装运对象的列表,我需要进行API调用以获取关于每个装运的一些信息。我正在尝试并行地进行这些网络调用。因此,我正在使用Java 8
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中的线程数量,所以我需要检查它的执行情况。如果池没有立即处理请求,我是否可以记录日志

    您可以通过
    ForkJoinPool.hasQueuedSubmissions()
    预先定期检查提交队列是否为空。因此,如果返回true,则不会立即处理请求。即使没有问题,您也可能会抓住这一时刻,因此可以使用
    ForkJoinPool.getQueuedSubmissionCount()
    (注意,它的时间复杂度为O(n),其中n是排队提交的数量)

    我的系统流量很大。所以,如果我在一个自动连接的ForkJoinPool上执行submit()和get(),我的代码是否会等待来自不同请求的发货?我的意思是,假设我同时收到两个请求。Request1有3个与之关联的装运,Request2有5个装运。那么,上述代码是否会一直等到所有8次发货完成

    是的,要等到8批货全部完成。根据池和队列大小,在最佳情况下,所需时间与最长装运处理所用时间大致相同