当前位置: 首页 > 知识库问答 >
问题:

如何为并行webservice请求配置线程池?

唐向荣
2023-03-14

我想同时向一个webservice发送webservice调用。最多应有20个并行请求等待webservice响应。任何其他请求都应该等待它们完成。

如果一个用户向我发送一个请求,这通常会导致向目标服务器发送5个并行请求。因此,我一次最多可以服务20/5=4个用户。其他人将不得不等待,这很好。或者被高负荷拒绝。

问题:我应该使用哪个线程池,以及如何配置它?

private ExecutorService asyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(20);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(100);
    executor.initialize();

    //return executor.getThreadPoolExecutor(); //I could as well use this. Which is better??
    return Executors.newFixedThreadPool(20, executor);
}

我读了上面的内容如下:主池可以向网络服务器发送20个并行请求(从而在parralel中立即为4个用户服务)。如果所有20个线程都很忙,并且有第五个用户进来,请求就会排队。

问题:

>

  • 配置是否正确?

    为什么我必须另外在Executors.newFixedThreadpool()中设置nthread=20?设置poolsize有什么区别?

    设置corePoolsize=20会有性能开销吗?我的意思是,这样池就不会收缩。但是我可能不会把它设置得更低(例如5),因为只有当队列耗尽时才会创建新线程。对吗?

  • 共有2个答案

    邴修远
    2023-03-14

    调用执行器时。newFixedThreadPool(20,执行器) 您正在将之前设置的执行器作为ThreadFactory传递,因为ThreadPoolTaskExecutor实现ThreadFactory接口。

    结果是一个ExecutorService,它以20个线程就绪、最多20个线程和一个无限的LinkedBlockingQueue开始,用于等待处理的任务(您可以在这里看到)https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int,java.util.concurrent.ThreadFactory))。

    至于你的第一个和第二个问题,你可以省略遗嘱执行人。如果您想使用jdk类ThreadPoolExecutor,可以调用newFixedThreadPool()并返回ThreadPoolTaskExecutor或调用getThreadPoolExecutor()。

    至于你的第三个问题——在启动时会有一个惩罚,因为jvm必须创建并运行20个线程,但我想这可以忽略不计。将corePoolSize设置为低于maximumPoolSize的值的一件事是,jvm将终止未分配的线程,这可以减少应用程序的内存占用。

    至于何时在ExecutorService中创建新线程-当队列中有任务并且没有达到最大池大小时,在ExecutorService中创建线程。如果达到执行器中的最大池大小并且队列已满-执行器将为提交给它的每个新任务抛出拒绝执行异常,直到再次有空间容纳新任务。您可以通过实现自己的拒绝执行处理程序来更改这种行为。

    松和泰
    2023-03-14

    我觉得

    executor.setMaxPoolSize(20) 
    

    可以通过构造函数覆盖最初设置的#个线程,在这种情况下似乎是多余的。这同样适用于setCorePoolSize。这只是为了动态控制。根据池的大小,一般可以考虑小定律。

     类似资料:
    • 问题内容: 有人可以解释什么是每个请求线程和每个连接线程吗?servlet使用哪种模型?如何分配线程来处理HTTP请求?是线程/请求还是连接? 假设我要在自己的方法中异步执行耗时的任务,那么我将使用Java执行程序启动一个新线程,以便在单独的线程中进行冗长的计算并立即发送响应。 现在,这是否可以确保我释放了正在处理我的线程,或者由于子线程仍在运行而仍在使用它? 问题答案: 每个请求意味着在发出HT

    • 我对所有这些异步/多线程lib和本地clojure功能感到迷茫。 我有一个Web服务,它调用外部API,转换它响应,然后回馈给客户端。现在是用Python编写的。我想让每个客户端在单独的线程中执行其请求,这样它们就不会等待彼此完成,或者服务器是异步的。不涉及繁重的计算,只需等待IO。 我原以为使用clojure会很容易,但是我忽略了一些东西...Aleph是异步服务器吧?然而,当我在请求处理程序中

    • 我知道PHP支持处理多个并发连接,并且根据服务器的不同,它可以像这个答案中提到的那样进行配置 服务器是如何管理多个连接的?它是为每个请求派生一个子进程,还是使用线程处理,还是使用线程池处理? 链接的答案说一个进程是分叉的,然后作者在评论中说是线程还是进程,这让人很困惑,如果请求是使用子进程、线程还是线程池提供的?

    • 是否可以配置使用1个执行线程? 我正在执行在中调用的代码。每次它运行时,我都会遇到不同的运行时行为,这使得研究回归变得很困难。 我希望代码库提供“调试”和“发布”模式。“调试”模式将使用固定种子配置,并使用单个执行线程配置。“释放”模式将使用系统提供的种子,并使用默认数量的线程。 我尝试配置的并行性为1,但它使用2个线程(和第二个工作线程)。有什么想法吗?

    • 我试图从javascript本身调用另一个域中的服务。我可以请求跨域服务。但我无法从服务中检索信息。一些我如何被同源政策阻止。请帮我找出代码中的错误。 OPTIONS/SolartisGeoCodelookupService/Service/DrawRegions HTTP/1.1 主机:Cross_Domain_IP_Address 用户代理:Mozilla/5.0(x11;Linux x86_

    • 问题内容: 我正在创建一个Android应用程序,该应用程序必须在后台执行Web请求,然后处理接收到的数据并根据服务器响应修改用户界面。 在后台发布请求和处理数据的目的是避免冻结用户界面。但是目前,我注意到用户界面处于冻结状态,因此我不确定逻辑是否按预期工作。 这是代码的一部分,应该在其自己的线程中发布请求并处理响应,然后将数据传递给GUI: 从实现ServerResponseHandler的主要