ArrayBlockingQueue take()とpoll()の違い
897 ワード
take()関数を使用して、キューにデータがない場合、スレッドwaitはCPUを解放し、poll()は待たずにnullに戻ります.同様に、スペースが消費されるとoffer()関数は待たずにfalseに戻り、put()はwaitになるので、while(true)を使用してキュー要素を取得する場合は、poll()を使用しないでください.CPUは100%になります.
また、ThreadPoolExecutorにn個のスレッドを常駐させる場合は、「public void allowCoreThreadTimeOut(boolean value)」を呼び出してこの属性をfalseに設定します.そうでない場合は
また、ThreadPoolExecutorにn個のスレッドを常駐させる場合は、「public void allowCoreThreadTimeOut(boolean value)」を呼び出してこの属性をfalseに設定します.そうでない場合は
Runnable getTask() {
for (;;) {
try {
int state = runState;
if (state > SHUTDOWN)
return null;
Runnable r;
if (state == SHUTDOWN) // Help drain queue
r = workQueue.poll();
else if (poolSize > corePoolSize || allowCoreThreadTimeOut)
r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS);
else
r = workQueue.take();
ポーリングキューを繰り返し、大量のCPUを消費します.