最近JDK RC已经发布了而对于JDK的新特性还来不及使用虽然在项目中还没有使用但可以写一些Demo体验一下Tiger的魅力现在的时代就是体验的时代事事都要亲历亲为才能有发言权怎么有点毛主席实事求是的感觉
JDK中的一个亮点就是将Doug Lea的并发库引入到Java标准库中Doug Lea确实是一个牛人能教书能出书能编码不过这在国外还是比较普遍的而国内的教授们就相差太远了
一般的服务器都需要线程池比如WebFTP等服务器不过它们一般都自己实现了线程池比如以前介绍过的TomcatResin和Jetty等现在有了JDK我们就没有必要重复造车轮了直接使用就可以何况使用也很方便性能也非常高
packageconcurrent;
importjavautilconcurrentExecutorService;
importjavautilconcurrentExecutors;
publicclassTestThreadPool{
publicstaticvoidmain(Stringargs[])throwsInterruptedException{
//onlytwothreads
ExecutorServiceexec=ExecutorsnewFixedThreadPool();
for(intindex=;index<;index++){
Runnablerun=newRunnable(){
publicvoidrun(){
longtime=(long)(Mathrandom()*);
Systemoutprintln(Sleeping+time+ms);
try{
Threadsleep(time);
}catch(InterruptedExceptione){
}
}
};
execexecute(run);
}
//mustshutdown
execshutdown();
}
}
上面是一个简单的例子使用了个大小的线程池来处理个线程但有一个问题在for循环的过程中会等待线程池有空闲的线程所以主线程会阻塞的为了解决这个问题一般启动一个线程来做for循环就是为了避免由于线程池满了造成主线程阻塞不过在这里我没有这样处理[重要修正经过测试即使线程池大小小于实际线程数大小线程池也不会阻塞的这与Tomcat的线程池不同它将Runnable实例放到一个无限的BlockingQueue中所以就不用一个线程启动for循环]
另外它使用了Executors的静态函数生成一个固定的线程池顾名思义线程池的线程是不会释放的即使它是Idle这就会产生性能问题比如如果线程池的大小为当全部使用完毕后所有的线程会继续留在池中相应的内存和线程切换(while(true)+sleep循环)都会增加如果要避免这个问题就必须直接使用ThreadPoolExecutor()来构造可以像Tomcat的线程池一样设置最大线程数最小线程数和空闲线程keepAlive的时间通过这些可以基本上替换Tomcat的线程池实现方案
[] []