请考虑以下服务类别:
//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是很昂贵的。因此,另一个选项就是按顺序运行服务调用。
发布于 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!
警告:如果适用的话,请阅读ThreadLocal在ThreadPool中使用的副作用.
https://stackoverflow.com/questions/57904512
复制相似问题