Java 对ExecutorService的并发访问

Java 对ExecutorService的并发访问,java,multithreading,java.util.concurrent,Java,Multithreading,Java.util.concurrent,考虑以下服务类别:- //Singleton service public class InquiryService{ private final ExecutorService es = Executors. newSingleThreadExecutor(); private final CustomerService cs = new CustomerServiceImpl(); public String process(){ //Asy

考虑以下服务类别:-

//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.
    }
}
//单例服务
公共类查询服务{
private final Executors service es=Executors.newSingleThreadExecutor();
private final CustomerService cs=新CustomerService Impl();
公共字符串进程(){
//从CustomerService获取信息的异步调用
未来结果=es.submit(()->{return cs.getCustomer()});
//查询数据库
//执行逻辑等等
字符串customerName=result.submit.get();
//继续处理。
}
}
上面的服务类有一个
ExecutorService
as字段。如果说,
进程
方法上有100个并发请求,那么剩余的(100-1)个请求是否需要等待线程可用性

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

另一个选项将作为
新线程运行(newfuturetask(()->{return cs.getCustomer()}))
。哪一个是正确的方法

更新:-


根据评论和回答,重复使用和频繁创建新
线程的
ExecutorService
成本高昂。因此,另一个选项是按顺序运行服务调用。

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

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

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

如何解决请求等待

您的线程池中需要更多线程来执行任务

我可以考虑的一个选项是实例化、使用和关闭 进程内执行器服务方法

这真是个坏主意。创建和销毁
线程
花费的时间太长。更多关于这个。这就是使用
线程池的全部想法

另一个选项是作为新线程运行(新的FutureTask(()-> {return cs.getCustomer()})

构造一个
新线程()
。阅读我前面的观点

那么,什么是对的

一种方法是创建一个
Executors.newFixedThreadPool(10)
,以便(90-10)请求等待。可以吗?或者,您可能正在寻找
newCachedThreadPool


警告:另外,如果适用,请阅读在
线程池中使用
ThreadLocal
的副作用。

固定大小1的线程池的使用非常有限,是的,所有其他并发请求都必须等待线程(您可以调整,但这不是重点)。线程池大于1时更有意义。已有
newSingleThreadExecutor
。创建一个1的线程“池”看起来像一个mistake@Michael是的,但这就是想法。@AwanBiru一个错误是想法吗?不要understand@Michael不,问题是关于使用单线程并发访问线程池。但是是的,你是对的,我会更新上面的示例。是的,singleton正确地实现了spring@Service或类似的功能。但是为什么“new Thread()”不可取呢?那真的很贵吗?