我正在使用jersey-client-3.0-SNAPSHOT。
我做的事情如下:
final Client client = createClient();
...
Builder builder = target.request();
for (final Entry<String, String> entry : getHeaders().entrySet()) {
builder = builder.header(entry.getKey(), entry.getValue());
}
final Builder finalBuilder = builder;
executor.submit(() -> {
final Entity<?> entity = createPostEntity();
futureResponse = finalBuilder.async().post(entity);
try {
response = futureResponse.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
consumeResponse(response);
} catch (ExecutionException | TimeoutException | InterruptedException | IOException e) {
errorConsumer.accept(e);
}
});
if (futureResponse != null) {
try {
futureResponse.cancel(true);
} catch (final Exception e) {
//does nothing, now we try keep closing resources
}
}
if (response != null) {
try {
response.close();
} catch (final Exception e) {
//does nothing, now we try keep closing resources
}
}
... //等待回复,阅读或其他
client.close();
每次创建时都会出现一个新线程并销毁其中一个客户端。
有没有一种安全的方法来销毁这些线程? 这是预期的行为吗? 我做错了吗?
答案 0 :(得分:2)
在asynchronous
的{{1}}来电中,每当我们在Jersey client
对象上致电close()
时,它都会销毁client
来电中使用的thread
。因此,预期行为是每当async
语句执行时,它将销毁该线程,下次将为下一个client.close()
调用创建一个新线程。
现在,考虑错误情况的关闭async
对象和关联线程的安全方法之一如下 -
client