等待线程的开销是多少?
What is the overhead of a waiting thread?
我正在 android 中使用 Volley 库进行 Http 通信。默认情况下,volley 库保留 4 个线程,这些线程从 BlockingQueue 获取 http 'Request' 对象(Request 对象包含所有用于发出 http 请求的详细信息,如 url、http 方法、要发布的数据等)并使http请求并发。当我分析我的应用程序需求时,只有不到 10% 的时间我会同时使用所有 4 个线程,而其余时间我会使用该线程池中的 1 或 2 个线程。所以实际上 2 到 3 个线程将在几乎 90% 的时间内处于 wait() 模式。
所以这是我的问题,
1) 处于 wait() 模式的线程的开销是多少,它是否消耗了大量的 cpu 周期?让所有这些线程等待对我来说是个好主意吗?
我假设由于等待线程将在一个循环左右(内部实现)中连续检查 monitor/lock 以唤醒,它可能会消耗相当多的 cpu 周期来维护一个等待线程。如果我错了请纠正我。
谢谢。
- What is the overhead of a thread which is in wait() mode
None。等待线程根本不消耗任何 CPU 周期,它只是等待被唤醒。所以不要打扰自己。
- I assume that since a waiting thread will be continuously polling on a monitor/lock internally to wake up ,it might consume a considerable amount af cpu cycles to maintain a waiting thread . Correct me if I am wrong.
事实并非如此。等待线程不对监视器/锁/任何东西.
进行任何轮询
大量线程会影响性能的唯一情况是有许多 active 线程(远远超过 CPUs/ 内核的 nr)经常来回切换。因为 CPU 上下文切换也会带来一些成本。等待线程只消耗内存,不CPU.
如果你想看看线程的内部实现——我不得不让你失望了。像 wait()
/ notify()
这样的方法是原生的——这意味着它们的实现依赖于 JVM。因此,如果是 HotSpot JVM
,您可以查看其源代码(用 C++/ 编写,并带有一些汇编程序)。
但是你真的需要这个吗?为什么您不想信任 JVM 文档?
我正在 android 中使用 Volley 库进行 Http 通信。默认情况下,volley 库保留 4 个线程,这些线程从 BlockingQueue 获取 http 'Request' 对象(Request 对象包含所有用于发出 http 请求的详细信息,如 url、http 方法、要发布的数据等)并使http请求并发。当我分析我的应用程序需求时,只有不到 10% 的时间我会同时使用所有 4 个线程,而其余时间我会使用该线程池中的 1 或 2 个线程。所以实际上 2 到 3 个线程将在几乎 90% 的时间内处于 wait() 模式。
所以这是我的问题, 1) 处于 wait() 模式的线程的开销是多少,它是否消耗了大量的 cpu 周期?让所有这些线程等待对我来说是个好主意吗?
我假设由于等待线程将在一个循环左右(内部实现)中连续检查 monitor/lock 以唤醒,它可能会消耗相当多的 cpu 周期来维护一个等待线程。如果我错了请纠正我。
谢谢。
- What is the overhead of a thread which is in wait() mode
None。等待线程根本不消耗任何 CPU 周期,它只是等待被唤醒。所以不要打扰自己。
- I assume that since a waiting thread will be continuously polling on a monitor/lock internally to wake up ,it might consume a considerable amount af cpu cycles to maintain a waiting thread . Correct me if I am wrong.
事实并非如此。等待线程不对监视器/锁/任何东西.
进行任何轮询大量线程会影响性能的唯一情况是有许多 active 线程(远远超过 CPUs/ 内核的 nr)经常来回切换。因为 CPU 上下文切换也会带来一些成本。等待线程只消耗内存,不CPU.
如果你想看看线程的内部实现——我不得不让你失望了。像 wait()
/ notify()
这样的方法是原生的——这意味着它们的实现依赖于 JVM。因此,如果是 HotSpot JVM
,您可以查看其源代码(用 C++/ 编写,并带有一些汇编程序)。
但是你真的需要这个吗?为什么您不想信任 JVM 文档?