当前位置: 首页 > 知识库问答 >
问题:

okhttp改造-大量线程处于监视状态

顾梓
2023-03-14

我已经建立了一个应用程序,我使用了Okhttp和改装。除了一些不规则的有线行为外,一切正常。在这个新闻应用程序中,我触发了多个部分的提要下载请求。时间到时间请求从不返回任何响应(甚至不会抛出异常),它只是被卡住了,在Logcat中,我看到了连续的垃圾收集。

我试图找到潜在的嫌疑人,但什么都找不到。从ddms中的“线程”中,我唯一能看到的是很多线程都处于“监视”状态(请参见屏幕截图)

编辑:另一个用于改装的常见线程转储:

这是改造配置:

public interface ApiService {
    @GET("/feed/get-news-feed/{section}")
    void getNewsArticles(
            @Path("section") String section, 
            Callback<GeneratedNewsEntryList> callback
    );
}

public static ApiService getInstance() {
    if(service == null) {
        OkHttpClient okHttpClient = new OkHttpClient();
        File cacheDir = App.getContext().getCacheDir();
        HttpResponseCache cache = null;
        try {
            cache = new HttpResponseCache(cacheDir, 1024);
        } catch (IOException e) {
            e.printStackTrace();
        }
        okHttpClient.setResponseCache(cache);

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setServer(BASE_URL)
                .setClient(new OkClient(okHttpClient))
                .setErrorHandler(new ErrorHandler() {

                    @Override
                    public Throwable handleError(RetrofitError arg0) {
                        if(arg0.getResponse().getStatus() == 404)
                            return new Exception("Url does not exists");

                        return new Exception(arg0.getMessage());
                    }
                })
                .build();
        service = restAdapter.create(ApiService.class);
    }

    return service;
}

有没有想法,有没有经历过类似的问题?

共有1个答案

秦哲瀚
2023-03-14

看起来要么是响应缓存中的错误,要么是文件系统工作不正常。

在将文件写入文件系统时,响应缓存持有一个锁,其中一次写入似乎没有很快完成。能否显示其他线程的线程转储?

 类似资料:
  • 我正在尝试实现线程,其中一个线程生成随机数,而另一个线程等待,一旦它生成随机数,它应该通知并等待另一个线程也这样做。我收到了非法的监控状态异常,请帮我指出我的错误。

  • 问题内容: 我要使用的REST服务以压缩的JSON格式存储答案。它提供,但是我的OkHttp不会将其编码为可读文本,因此JSON转换器将引发异常。 根据Jake Whartons的评论, 标头应告诉OkHttp解码正文。 用于创建RestAdapter的代码是: gradle依赖项是: 我的ServiceInterface中的方法: 问题答案: 替换为: 有了这个: 当您提供自己的标头时,您将指示

  • 我们在其中一个模块中使用了Hystrix-断路器模式[library]。usecase是:-我们正在从kafka轮询16个消息,并使用pararllel流处理它们,因此,对于工作流中的每条消息,它需要3个rest调用,这些调用由hystric命令保护。现在,问题是当我尝试运行单个实例时,CPU显示尖峰,线程转储显示许多线程处于等待状态,等待所有3个命令。如下所示:-

  • 用例:每次我需要处理一个作业时创建一个新线程。 目前的实现:我使用的执行器服务与固定大小的线程池,例如50。对于每个作业,我都向executor服务提交一个新线程。 我试图实现的行为更像是自动伸缩。在高峰时间跨越更多的服务器(在本例中是线程)。并在负载不是很高的时候终止额外的服务器并保持最小的服务器计数。

  • 我已经用Java编写了一个简单的ECHO协议服务器,使用。 很简单: 线程正在上等待客户端的输入。但是我发现所有的工作线程都处于状态,通过,我认为它们可能处于状态。 线程在等待数据到达时被阻塞,但为什么在这里它是可运行的? 下面是输出:

  • 我想使用DropWizard中的Guage指标来监控我的线程池大小。 据我所知,这是在间隔时间内自动完成的。但似乎我没有获得注册指标的任何监控数据。虽然我的应用程序中的其他指标(如计数器和计时器)工作得很好。 有人能帮助我哪里做错了吗? 谢谢。