3

クラスのメソッドのコメントによるとpublic static ExecutorService newCachedThreadPool()Executor

Threads that have not been used for sixty seconds are terminated and 
removed from the **cache**.

キャッシュはどこにあり、どのように機能するのだろうか? またはそれがスーパークラスCollectionである可能性のある静的変数が見られなかったので。ThreadPoolExecutor

4

3 に答える 3

1

Cache言葉は単なる抽象化です。内部的にはHashSet、スレッドを保持するために使用します。コードに従って:

/**
 * Set containing all worker threads in pool. Accessed only when
 * holding mainLock.
 */
private final HashSet<Worker> workers = new HashSet<Worker>();

そして、あなたがランナブルに興味を持っているなら、あなたsubmitまたはexecute.

newCachedThreadPoolを使用SynchronousQueue<Runnable>してそれらを処理します。

于 2013-04-22T08:53:57.930 に答える
0

ThreadPoolExecutorのコードを調べると、次のように表示されます。

 /**
 * Set containing all worker threads in pool. Accessed only when
 * holding mainLock.
 */
private final HashSet<Worker> workers = new HashSet<Worker>();

この:

/**
 * The queue used for holding tasks and handing off to worker
 * threads.  We do not require that workQueue.poll() returning
 * null necessarily means that workQueue.isEmpty(), so rely
 * solely on isEmpty to see if the queue is empty (which we must
 * do for example when deciding whether to transition from
 * SHUTDOWN to TIDYING).  This accommodates special-purpose
 * queues such as DelayQueues for which poll() is allowed to
 * return null even if it may later return non-null when delays
 * expire.
 */
private final BlockingQueue<Runnable> workQueue;

この:

 try {
          Runnable r = timed ?
               // here keepAliveTime is passed as sixty seconds from
               // Executors#newCachedThreadPool()
               workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
               workQueue.take();
           if (r != null)
                return r;
           timedOut = true;
        } catch (InterruptedException retry) {
            timedOut = false;
        }

実際の実装コードを順を追って説明します。これらの指針を心に留めておくと、より明確に理解するのに役立ちます。

于 2013-04-22T08:54:23.350 に答える