知识大全 JDK5 java.util.concurrent 线程池[1]
Posted 知
篇首语:既靠天,也靠地,还靠自己。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JDK5 java.util.concurrent 线程池[1]相关的知识,希望对你有一定的参考价值。
JDK5 java.util.concurrent 线程池[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
最近JDK RC已经发布了 而对于JDK 的新特性还来不及使用 虽然在项目中还没有使用 但可以写一些Demo体验一下Tiger的魅力 现在的时代就是体验的时代 事事都要亲历亲为才能有发言权 怎么有点毛主席 实事求是 的感觉
JDK 中的一个亮点就是将Doug Lea的并发库引入到Java标准库中 Doug Lea确实是一个牛人 能教书 能出书 能编码 不过这在国外还是比较普遍的 而国内的教授们就相差太远了
一般的服务器都需要线程池 比如Web FTP等服务器 不过它们一般都自己实现了线程池 比如以前介绍过的Tomcat Resin和Jetty等 现在有了JDK 我们就没有必要重复造车轮了 直接使用就可以 何况使用也很方便 性能也非常高
packageconcurrent; importjava util concurrent ExecutorService; importjava util concurrent Executors; publicclassTestThreadPool publicstaticvoidmain(Stringargs[])throwsInterruptedException //onlyothreads ExecutorServiceexec=Executors newFixedThreadPool( ); for(intindex= ;index< ;index++) Runnablerun=newRunnable() publicvoidrun() longtime=(long)(Math random()* ); System out println( Sleeping +time+ ms ); try Thread sleep(time); catch(InterruptedExceptione) ; exec execute(run); //mustshutdown exec shutdown();
上面是一个简单的例子 使用了 个大小的线程池来处理 个线程 但有一个问题 在for循环的过程中 会等待线程池有空闲的线程 所以主线程会阻塞的 为了解决这个问题 一般启动一个线程来做for循环 就是为了避免由于线程池满了造成主线程阻塞 不过在这里我没有这样处理 [重要修正 经过测试 即使线程池大小小于实际线程数大小 线程池也不会阻塞的 这与Tomcat的线程池不同 它将Runnable实例放到一个 无限 的BlockingQueue中 所以就不用一个线程启动for循环]
另外它使用了Executors的静态函数生成一个固定的线程池 顾名思义 线程池的线程是不会释放的 即使它是Idle 这就会产生性能问题 比如如果线程池的大小为 当全部使用完毕后 所有的线程会继续留在池中 相应的内存和线程切换(while(true)+sleep循环)都会增加 如果要避免这个问题 就必须直接使用ThreadPoolExecutor()来构造 可以像Tomcat的线程池一样设置 最大线程数 最小线程数 和 空闲线程keepAlive的时间 通过这些可以基本上替换Tomcat的线程池实现方案
cha138/Article/program/Java/gj/201311/27713相关参考
JDK5.0中的泛型类型学习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JDK中增加的泛型类