在数量不大,且不频繁抢占CPU的情况下,几乎可以忽略这种内存开销。
相比与线程的内存开销,大量线程互相抢占CPU才是更可怕的性能瓶颈

解决方案 »

  1.   

    看了下代码:
    public void run() {
                try {
                    Runnable task = firstTask;
                    firstTask = null;
                    while (task != null || (task = getTask()) != null) {
                        runTask(task);
                        task = null;
                    }
                } finally {
                    workerDone(this);
                }
            }
    在发现队列里面没有任务的时候,会在workerDone中将线程remove掉,所以没有楼主担心的这个问题吧?在创建线程池的时候,第一个参数是corePoolSize,这个参数在execute里面看到作用:
        public void execute(Runnable command) {
            if (command == null)
                throw new NullPointerException();
            if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
                if (runState == RUNNING && workQueue.offer(command)) {
                    if (runState != RUNNING || poolSize == 0)
                        ensureQueuedTaskHandled(command);
                }
                else if (!addIfUnderMaximumPoolSize(command))
                    reject(command); // is shutdown or saturated
            }
        }
    如果poolsize < corePoolSize的时候,那么就会执行addIfUnderCorePoolSize,在这个函数里面所做的事情就是创建一个线程来执行任务。如果poolsize >= corePoolSize的时候,那么就将任务放到阻塞队列里面去。所以我觉得corePoolSize是用来影响提交任务时的策略。。另外,线程常驻内存当然是占用内存的,但是线程资源占用的量是很小的,但是我们用来实现逻辑的其他资源占用内存的量就不好说啦。