Welcome 微信登录

首页 / 软件开发 / JAVA / 深入浅出多线程(4)对CachedThreadPool OutOfMemoryError问题的一些想法

深入浅出多线程(4)对CachedThreadPool OutOfMemoryError问题的一些想法2011-09-07 BlogJava vincent接系列3,在该系列中我们一起探讨一下CachedThreadPool。

线程池是Conncurrent包提供给我们的一个重要的礼物。使得我们没有必要维 护自个实现的心里很没底的线程池了。但如何充分利用好这些线程池来加快我们 开发与测试效率呢?当然是知己知彼。本系列就说说对CachedThreadPool使用的 一下问题。

下面是对CachedThreadPool的一个测试,程序有问题吗?

package net.blogjava.vincent;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class CachedThreadPoolIssue {
/**
* @param args
*/
public static void main(String[] args) {

ExecutorService es = Executors.newCachedThreadPool();
for(int i = 1; i<8000; i++)
es.submit(new task());
}
}
class task implements Runnable{
@Override
public void run() {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

如果对JVM没有特殊的设置,并在Window平台上,那么就会有一 下异常的发生:

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize (Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.execute(Unknown Source)
at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
at net.blogjava.vincent.CachedThreadPoolIssue.main (CachedThreadPoolIssue.java:19)