文档详情

Java线程池编程.doc

发布:2016-08-23约2.79万字共38页下载文档
文本预览下载声明
线程池编程 java.util.concurrent 多线程框架---线程池编程(一) 一般的服务器都需要线程池,比如Web、FTP等服务器,不过它们一般都自己实现了线程池,比如以前介绍过的Tomcat、Resin和Jetty等,现在有了JDK5,我们就没有必要重复造车轮了,直接使用就可以,何况使用也很方便,性能也非常高。 ?1?package?concurrent; ?2?import?java.util.concurrent.ExecutorService;? ?3?import?java.util.concurrent.Executors;? ?4?public?class?TestThreadPool? ?5?{? ?6?????public?static?void?main(String?args[])?throws?InterruptedException ?牋牋爗??牋牋牋牋?/爋nly爐wo爐hreads??牋牋牋牋燛xecutorService爀xec?燛xecutors.newFixedThreadPool(2);?10牋牋牋牋?for(int爄ndex??;爄ndex??00;爄ndex++) 11牋牋牋牋爗?12牋牋牋牋牋牋燫unnable爎un?爊ew燫unnable() 13牋牋牋牋牋牋爗?14牋牋牋牋牋牋牋牋爌ublic爒oid爎un()?15牋牋牋牋牋牋牋牋爗?16牋牋牋牋牋牋牋牋牋牋爈ong爐ime??long)?Math.random()??000);?17牋牋牋牋?牋牋牋牋牋牋System.out.println(Sleeping??爐ime??ms); 18牋牋牋牋牋牋牋牋牋牋爐ry 19牋牋牋牋牋牋牋牋牋牋爗 20牋牋牋牋牋牋牋牋牋牋牋牋燭hread.sleep(time);?21牋牋牋牋牋牋牋牋牋牋牋牋?22牋牋牋牋牋牋牋牋牋牋爙?23牋牋牋牋牋牋牋牋牋牋燾atch?InterruptedException爀)?24牋牋牋牋牋牋牋牋牋牋爗?25牋牋牋牋牋牋牋牋牋牋牋牋?26牋牋牋牋牋牋牋牋牋牋爙?27牋牋牋牋牋牋牋牋牋牋?28牋牋牋牋牋牋牋牋爙 29牋牋牋牋牋牋牋牋?30牋牋牋牋牋牋爙; 31牋牋牋牋牋牋牋牋牋牋?32牋牋牋牋牋牋爀xec.execute(run);?33牋牋牋牋牋牋牋牋牋牋?34牋牋牋牋爙?/爉ust爏hutdown 35牋牋牋牋牋牋牋牋牋牋?36牋牋牋牋爀xec.shutdown();?37牋牋牋牋?38牋牋爙?39牋牋?/} 40牋牋?} 41?//} 42? ? 上面是一个简单的例子,使用了2个大小的线程池来处理100个线程。但有一个问题:在for循环的过程中,会等待线程池有空闲的线程,所以主线程会阻塞的。为了解决这个问题,一般启动一个线程来做for循环,就是为了避免由于线程池满了造成主线程阻塞。不过在这里我没有这样处理。[重要修正:经过测试,即使线程池大小小于实际线程数大小,线程池也不会阻塞的,这与Tomcat的线程池不同,它将Runnable实例放到一个“无限”的BlockingQueue中,所以就不用一个线程启动for循环,Doug Lea果然厉害] 另外它使用了Executors的静态函数生成一个固定的线程池,顾名思义,线程池的线程是不会释放的,即使它是Idle。这就会产生性能问题,比如如果线程池的大小为200,当全部使用完毕后,所有的线程会继续留在池中,相应的内存和线程切换(while(true)+sleep循环)都会增加。如果要避免这个问题,就必须直接使用ThreadPoolExecutor()来构造。可以像Tomcat的线程池一样设置“最大线程数”、“最小线程数”和“空闲线程keepAlive的时间”。通过这些可以基本上替换Tomcat的线程池实现方案。 需要注意的是线程池必须使用shutdown来显式关闭,否则主线程就无法退出。shutdown也不会阻塞主线程。 许多长时间运行的应用有时候
显示全部
相似文档