在数量不大,且不频繁抢占CPU的情况下,几乎可以忽略这种内存开销。
相比与线程的内存开销,大量线程互相抢占CPU才是更可怕的性能瓶颈
相比与线程的内存开销,大量线程互相抢占CPU才是更可怕的性能瓶颈
解决方案 »
- java布局
- 怎样才能dtd文件放到myeclipse创建的项目中
- webwork 迭代问题
- 如何运行jar文件?
- JAVA有没有System.Web.UI.WebControls类似的类
- 监听器的问题
- 救命啊!!!写了两个sessionbean访问entitybean,一个可以跑,一个抛NullPointerException啊!~高手救命啊!!!
- 如何在Struts标记属性中嵌套Struts标记
- Hibernate的起步步骤(简单)
- 请问大家是如何解决jbuilder8里面的“字符移位现象”的?即插入或删除的字符并不在光标显示处???好烦恼呀!!!
- hibernate 一对多的多方条件查询
- jsoup 抓取javascript代码 求详解 (汽车之家 )
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是用来影响提交任务时的策略。。另外,线程常驻内存当然是占用内存的,但是线程资源占用的量是很小的,但是我们用来实现逻辑的其他资源占用内存的量就不好说啦。