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に設定します.そうでない場合は
 
 
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を消費します.