【问题标题】:Concurrent access to an ExecutorService并发访问 ExecutorService
【发布时间】:2019-09-12 10:13:10
【问题描述】:

考虑下面的服务类:-

//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 方法中实例化、使用和关闭ExecutorService。但是,线程池不是要被重用吗?

另一个选项将以 new Thread(new FutureTask&lt;&gt;(() -&gt; {return cs.getCustomer()})) 运行。哪一个是正确的方式?

更新:-

根据 cmets 和答案,ExecutorService 意味着被重用并且频繁地创建新的Thread 是昂贵的。因此,另一种选择是按顺序运行服务调用。

【问题讨论】:

  • 固定大小为 1 的线程池在使用方面非常有限,是的,所有其他并发请求都必须等待线程(您可以调整它,但这不是重点)。当线程池大于 1 时,线程池更有意义。
  • 已经有newSingleThreadExecutor。创建一个 1 的线程“池”似乎是个错误
  • @Michael 确实如此,但这就是想法。
  • @AwanBiru 这个想法有错吗?不明白
  • @Michael 不,问题是关于单线程线程池的并发访问。但是是的,你是对的,我会更新上面的示例。

标签: java multithreading java.util.concurrent


【解决方案1】:

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

剩余的 (100-1) 个请求是否需要等待线程可用?

哦,是的,所有 100-1 个其他请求都必须等待,因为第一个请求已经在线程池中的线程中执行。由于线程池是固定大小的,它永远不会增长来处理其他请求。

如何解决请求等待?

您的线程池中需要更多线程来处理您的任务。

我能想到的一个选项是,实例化、使用和关闭 进程方法中的ExecutorService

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

另一个选项将作为 new Thread(new FutureTask(() -> {return cs.getCustomer()}))

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

那么,什么是对的!?

一种方法是使用Executors.newFixedThreadPool(10),以便 (90-10) 请求等待。没事吧?或者你正在寻找newCachedThreadPool

警告:另外,请阅读在ThreadPool 中使用ThreadLocal 的副作用(如果适用)。

【讨论】:

  • 是的,单例正确实现了 spring @Service 或类似的。但是为什么`new Thread()` 是不可取的呢?真的很贵吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多