我正在使用JerseyClient对http服务器进行异步调用,并直接创建Futures来存储响应。这些甚至可以是批量调用,在这种情况下我会创建一个期货列表。
现在这很好用,但我担心CPU利用率和线程数,因为我没有使用Executor服务创建任何线程池,也没有使用FutureTask<>创造未来。
我如何构建每个未来的小代码片段:
Future<Response> response = requestBuilder.async().get();
这些问题是否有效?可以继续这种方法吗?这种方法不会扩展吗?
另一个问题是get()可能永远不会在某些期货上执行?这是否会导致产生永远不会被杀死的线程,因为对这些线程上运行的期货都没有执行get()或cancel()?
答案 0 :(得分:0)
最好控制应用程序创建的threads
的数量,以便在使用REST API
调用Jersey async API
时,您应该限制threads
创建的数量。
以下代码可用于控制threads
中jersey client
创建的async API
的最大数量 -
ClientConfig cc = new ClientConfig();
cc.property(ClientProperties.ASYNC_THREADPOOL_SIZE , 10);
Client client = ClientBuilder.newClient(cc);
与关于Future实例的get()
方法调用相关的另一点,get()
方法只是一种阻止方法,可让您的current thread
等待future task
完成response
收到的案例,不会影响threads
的执行。因此,如果您未在回复get()
实例上致电cancel()
或Future
,则不会出现任何问题。