【问题标题】:What is the overhead of a waiting thread?等待线程的开销是多少?
【发布时间】:2016-04-15 10:50:15
【问题描述】:

我正在使用 android 中的 Volley 库进行 Http 通信。默认情况下,volley 库保留 4 个线程,它们从 BlockingQueue 获取 http 'Request' 对象(请求对象包含用于发出 http 请求的所有详细信息,如 url、http 方法、要发布的数据等)并同时发出 http 请求。当我分析我的应用程序需求时,只有不到 10% 的时间我会同时使用所有 4 个线程,而其余时间我将使用该线程池中的 1 或 2 个线程。所以实际上 2 到 3 个线程几乎 90% 的时间都处于 wait() 模式。

所以这是我的问题, 1) 处于 wait() 模式的线程的开销是多少,它是否消耗大量的 cpu 周期?让所有这些线程等待对我来说是个好主意吗?

我假设由于等待线程将在一个循环左右(内部实现)中不断检查监视器/锁定以唤醒,它可能会消耗相当多的 cpu 周期来维持等待线程。如果我错了,请纠正我。

谢谢。

【问题讨论】:

  • 它根本不消耗任何 CPU 周期,而且 2-3 并不是“所有这些”,它是一个非常小的数字。您对轮询的假设不正确。
  • 谢谢。只是想更深入地了解 Threads 的内部实现。如果您能推荐任何文章,那就太好了?而且我认为我滥用了 polling 这个词。我的意思是检查一个监视器/锁定一个循环左右。

标签: java android multithreading threadpool android-volley


【解决方案1】:
  1. 处于 wait() 模式的线程的开销是多少

没有。等待线程根本不消耗任何 CPU 周期,它只是等待被唤醒。所以不要打扰自己。

  1. 我假设由于等待线程将在内部不断轮询监视器/锁以唤醒,它可能会消耗相当多的 af cpu 周期来维持等待线程。如果我错了,请纠正我。

那不是真的。等待线程不会对监视器/锁/任何东西进行任何轮询。

大量线程会影响性能的唯一情况是有许多活动线程(远远超过 nr 个 CPU/内核)经常来回切换。因为 CPU 上下文切换也会带来一些成本。等待线程只消耗内存,不消耗CPU。

如果您想查看线程的内部实现 - 我不得不让您失望。像 wait()/ notify() 这样的方法是原生的——这意味着它们的实现依赖于 JVM。因此,如果是HotSpot JVM,您可以查看它的源代码(用 C++/ 编写,带有一点汇编程序)。

但是你真的需要这个吗?为什么您不想信任 JVM 文档?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2022-01-03
    • 2011-04-25
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多