首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发访问ExecutorService

并发访问ExecutorService
EN

Stack Overflow用户
提问于 2019-09-12 10:13:10
回答 1查看 434关注 0票数 2

请考虑以下服务类别:

代码语言:javascript
复制
//Singleton service
public class InquiryService{

    private final ExecutorService es = Executors. newSingleThreadExecutor();
    private final CustomerService cs = new CustomerServiceImpl();

    public String process(){

          //Asynchronous calls to get info from CustomerService
          Future<String> result = es.submit(()->{return cs.getCustomer()});

          //Query database
          //Perform logic et all

          String customerName = result.submit.get();

          //continue processing.
    }
}

上面的服务类有一个ExecutorService字段。如果说,process方法上有100个并发请求,那么剩余的( 100 -1)请求是否需要等待线程可用性?

如何解决请求等待?我可以考虑的一个选项是,在process方法中实例化、使用和关闭process。但是,线程池不是要重用的吗?

另一个选项将以new Thread(new FutureTask<>(() -> {return cs.getCustomer()}))的形式运行。哪条路是正确的?

更新:-

根据评论和答案,ExecutorService应该被重用,频繁地创建新的Thread是很昂贵的。因此,另一个选项就是按顺序运行服务调用。

EN

回答 1

Stack Overflow用户

发布于 2019-09-12 10:29:36

您的服务是singleton,这意味着在整个应用程序运行时只存在一个实例(如果实现正确的话!)因此,实际上您有一个ExecutorService处理一个newFixedThreadPool(1)

剩余的(100-1)请求需要等待线程可用性吗?

哦,是的,由于第一个请求已经在线程池中的线程中执行,所以您的所有100-1其他请求都必须等待。由于线程池的大小是固定的,因此它永远无法处理其他请求。

如何解决请求等待?

您需要在线程池中更多的线程来承担您的任务。

我可以考虑的一个选项是,在process方法中实例化、使用和关闭ExecutorService。

这真是个坏主意。创建和销毁Thread所花费的时间太长了。关于这个here的更多信息。这就是使用ThreadPool的全部想法。

另一个选项将作为新线程运行(新的FutureTask<>(() -> {返回cs.getCustomer()}))

构造一个new Thread()。读我之前的观点。

那么,什么是正确的!?

一种方法是对Executors.newFixedThreadPool(10)进行访问,以便(90-10)请求等待。这样可以吗?或者你是在找newCachedThreadPool

警告:如果适用的话,请阅读ThreadLocalThreadPool中使用的副作用.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57904512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档