黑马程序员技术交流社区

标题: 关于线程池的问题 [打印本页]

作者: 袁计艳    时间: 2012-3-30 22:21
标题: 关于线程池的问题
ExecutorService pool=Executors.newSingleThreadExecutor();
为什么用线程池,线程不可以吗? 一般都什么时候用线程池?
作者: 王运科    时间: 2012-3-30 22:41
本帖最后由 王运科 于 2012-3-30 22:54 编辑

线程池的作用:
1:提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2:方便管理 可以编写线程池管理代码对池中的线程统一进行管理,比如说系统启动时由该程序创建100个线程,每当有请求的时候,就分配一个线程去工作, 如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃

正确的使用方法是有一堆任务需要创建线程去执行,任务就是对象,是实现了Runnable接口的对象,那么此时就用线程池
作者: 肖发腾    时间: 2012-3-30 22:46
要弄明白为什么用线程池,什么时候用,什么时候不用,就先来看一下线程池的产生:

     在服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。
构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。
实际上,对于原型开发这种方法工作得很好,但如果试图部署以这种方式运行的服务器应用程序,那么这种方法的严重不足就很明显。
每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;
为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。
除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。
在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。
为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。
线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。

其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。
而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,
直到获得一个线程来处理为止,从而可以防止资源不足。、


总结:
什么情况下使用线程池:
   1.单个任务处理的时间比较短    
     2.将需处理的任务的数量大

使用线程池的好处:    
    1.减少在创建和销毁线程上所花的时间以及系统资源的开销    
    2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2