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”

如何将 IDispatch::Invoke 放入 MFC C++ 线程?

C# 多线程 Invoke BeginInvoke

C#中Control的Invoke和BeginInvoke是相对于支线线程