等待线程的开销是多少?

use*_*376 4 java multithreading android threadpool android-volley

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

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

我假设由于等待线程将在循环中连续检查监视器/锁(内部实现)以唤醒,因此它可能会消耗大量的 CPU 周期来维护等待线程。如果我错了请纠正我。

谢谢 。

G. *_*cki 5

  1. 处于 wait() 模式的线程的开销是多少

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

  1. 我假设由于等待线程将在内部不断轮询监视器/锁以唤醒,因此可能会消耗大量的 CPU 周期来维护等待线程。如果我错了请纠正我。

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

大量线程会损害性能的唯一情况是存在许多经常来回切换的活动线程(远多于 CPU/核心数)。因为CPU上下文切换也是有一定成本的。等待线程只消耗内存,不消耗CPU。

如果您想查看线程的内部实现 - 我不得不让您失望。wait()像/这样的方法notify() 是本机的 - 这意味着它们的实现取决于 JVM。因此,如果是这种情况,HotSpot JVM您可以查看其源代码(用 C++/ 编写,带有一些汇编程序)。

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