Code Bye

java线程池常驻线程占内存吗

 

scheduler = new ThreadPoolExecutor(IDLE_CURRENT_NUM, MAX_CURRENT_NUM, THREAD_KEEPLIVE_MINUTE, TimeUnit.SECONDS, blockingQueue);

这个IDLE_CURRENT_NUM是个常驻线程数量,在线程池始终没有任务执行的情况下会自动关闭吗,如果不关闭他不就占用内存浪费资源吗?


10分
在数量不大,且不频繁抢占CPU的情况下,几乎可以忽略这种内存开销。
相比与线程的内存开销,大量线程互相抢占CPU才是更可怕的性能瓶颈
在线程池始终没有任务执行的情况下  不会自动关的哈…,如果不关闭  基本不占用内存浪费资源 的哟…

5分
线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且还不能控制线程池中线程的开始、挂起、和中止。

10分
执行时间和内存空间是一对永恒的矛盾,包括线程池在内的很多“池化”思想,都是用内存空间换取执行时间。所以,内存肯定是占用了,但相比当需要线程时去创建,用完后再销毁,所耗费的资源,占用些内存是更合理的。所以才会选择用线程池来维护一些不销毁的线程。

15分
看了下代码:
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是用来影响提交任务时的策略。。

另外,线程常驻内存当然是占用内存的,但是线程资源占用的量是很小的,但是我们用来实现逻辑的其他资源占用内存的量就不好说啦。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java线程池常驻线程占内存吗