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是用来影响提交任务时的策略。。 另外,线程常驻内存当然是占用内存的,但是线程资源占用的量是很小的,但是我们用来实现逻辑的其他资源占用内存的量就不好说啦。 |