等待线程的开销是多少?

时间:2016-01-11 07:34:44

标签: java android multithreading threadpool android-volley

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:3)

  
      
  1. 处于wait()模式的线程的开销是什么
  2.   

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

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

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

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

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

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