AsyncInvoker 不释放线程
Posted
技术标签:
【中文标题】AsyncInvoker 不释放线程【英文标题】:AsyncInvoker not releasing the Thread 【发布时间】:2016-02-28 04:18:16 【问题描述】:我正在使用 AsyncInvoker
使用 Jersey 2.0。这对我来说很好。但是,线程在返回完成后并没有结束。请注意,我不希望我调用的服务有任何响应。
public Future<Response> fire(WebTarget webTarget)
Future<Response> response = null;
try
response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
.accept(MediaType.APPLICATION_JSON_TYPE)
.headers(headers)
.async().get();
catch (Exception e)
e.printStackTrace();
return response;
【问题讨论】:
任何解决方案技术人员!!! 【参考方案1】:只要您不对未来值解析后提供给您的实际 javax.ws.rs.core.Response
做任何事情,请求响应流就会保持打开状态(并且与它关联的线程也是原始 HTTP 请求)猜测)。您应该:
-
对
javax.ws.rs.core.Response
对象执行操作并关闭它(或它的流)。
使用.get(MyPojo.class) 将响应流转换为实际对象。这将为您关闭流并在将来解析MyPojo
实例。
【讨论】:
【参考方案2】:您需要关闭您在调用方法中创建的client
对象。在调用方法中,您将有如下内容 -
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target(SERVER_URL).path(API_PATH).path(String.valueOf(id));
fire(webTarget);
所以你需要在调用这个方法后关闭你的client
-
client.close()
但是,关闭client
的推荐方式是在收到响应后。像下面这样 -
public void fire(WebTarget webTarget)
try
webTarget.request(MediaType.APPLICATION_JSON_TYPE)
.accept(MediaType.APPLICATION_JSON_TYPE)
.headers(headers)
.async().get(new InvocationCallback<Response>()
@Override
public void completed(Response response)
// Do whatever your wish with response
client.close();
@Override
public void failed(Throwable throwable)
throwable.printStackTrace();
client.close();
);
catch (Exception e)
e.printStackTrace();
【讨论】:
以上是关于AsyncInvoker 不释放线程的主要内容,如果未能解决你的问题,请参考以下文章
使用 Dispatcher.Invoke 从非主线程更改 WPF 控件
关于 Invoke、Invokerequired 和多线程的 C# 问题
嵌入式 Mono:如何在不同线程上使用“mono_runtime_invoke”