在没有ExecutorService或FutureTask的情况下创建期货

时间:2017-01-27 17:08:39

标签: jax-rs future executorservice jersey-client futuretask

我正在使用JerseyClient对http服务器进行异步调用,并直接创建Futures来存储响应。这些甚至可以是批量调用,在这种情况下我会创建一个期货列表。

现在这很好用,但我担心CPU利用率和线程数,因为我没有使用Executor服务创建任何线程池,也没有使用FutureTask<>创造未来。

我如何构建每个未来的小代码片段:

Future<Response> response = requestBuilder.async().get();

这些问题是否有效?可以继续这种方法吗?这种方法不会扩展吗?

另一个问题是get()可能永远不会在某些期货上执行?这是否会导致产生永远不会被杀死的线程,因为对这些线程上运行的期货都没有执行get()或cancel()?

1 个答案:

答案 0 :(得分:0)

最好控制应用程序创建的threads的数量,以便在使用REST API调用Jersey async API时,您应该限制threads创建的数量。

以下代码可用于控制threadsjersey 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,则不会出现任何问题。