【发布时间】: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<>(() -> {return cs.getCustomer()})) 运行。哪一个是正确的方式?
更新:-
根据 cmets 和答案,ExecutorService 意味着被重用并且频繁地创建新的Thread 是昂贵的。因此,另一种选择是按顺序运行服务调用。
【问题讨论】:
-
固定大小为 1 的线程池在使用方面非常有限,是的,所有其他并发请求都必须等待线程(您可以调整它,但这不是重点)。当线程池大于 1 时,线程池更有意义。
-
已经有
newSingleThreadExecutor。创建一个 1 的线程“池”似乎是个错误 -
@Michael 确实如此,但这就是想法。
-
@AwanBiru 这个想法有错吗?不明白
-
@Michael 不,问题是关于单线程线程池的并发访问。但是是的,你是对的,我会更新上面的示例。
标签: java multithreading java.util.concurrent