关于多线程和线程池

qemperor 2011-03-01 10:12:04
总体上来说我的理解就是

多线程 是为了多容纳一些运行的程序

线程池是为了限制运行程序的数量

可以这么理解吗


线程池理由如下:
在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在处理实际的用户请求的时间和资源要多得多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM里创建太多的线程,可能会导致系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是“池化资源”技术产生的原因。


...全文
179 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whut_lcy 2011-03-01
  • 打赏
  • 举报
回复
简单点,多线程是为了系统资源(西皮优,内存,总线等,但最主要的还是西皮优)得到更高效的使用,使得系统性能得到最大限度的发挥。多线程是操作系统在内核级实现(支持)的。

java作为一种编程语言的一种,提供了多线程的API,最终实现还是操作系统完成的。

玩过DOS吗?它是一种操作系统,单任务单用户。
如果你要把光驱里面的电影复制到硬盘,win下全选,然后拖过来,你可以看到好几个复制对话框弹出来,同时复制。这是因为win的explorer(资源管理器)是多线程的。

dos下呢?
copy f:\movie\*.rmvb d:\bak

这个命令也是复制所有的,但是复制的是一个一个复制的。

相比之下的差别就不言而喻了
雨木林风 2011-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccycat 的回复:]
多线程 主要目的为了并发
线程池 主要是为了线程的重用
[/Quote]
同意
yanebupt 2011-03-01
  • 打赏
  • 举报
回复
自我觉得线程池主要是为了线程的重用
liukelin 2011-03-01
  • 打赏
  • 举报
回复
很好!!!!!!!
ccycat 2011-03-01
  • 打赏
  • 举报
回复
多线程 主要目的为了并发
线程池 主要是为了线程的重用
soli11722984 2011-03-01
  • 打赏
  • 举报
回复
已经被果子大神说完了。。。。。。

偶来混分的,哈哈
  • 打赏
  • 举报
回复
线程池也有你所说的功能,因为操作系统对于一个进程所能开启的线程数量是有限制的,一般不会超过 2000 个,如果都是使用 new Thread#start 的话,而且执行的任务都很耗时,在请求量大时,系统资源就会耗尽,导致 JVM 崩溃。

线程池可以限制最大可以执行的任务数量,超过数量限制的任务就必须等待。
  • 打赏
  • 举报
回复
并不是很正确。

线程池主要是为了线程的重用而存在的。虽然对我们来说只要 new Thread(xxx).start() 就可以启动一个线程了,但是 JVM 和操作系统却要为此做出大量的工作,而且这种线程操作在完成后就被 JVM 和操作系统回收了。这样的话,导致系统花了很大的精力做了几秒钟的事情就将其回收了,不知道大家感觉怎么样,我感觉这种比较亏。

所以线程池的概念就出来了,new Thread 执行完一个任务后,并不是将其扔掉,而是将其放回线程池中,为下一个任务做准备。

我不知道你知不知道有一个称为数据库连接池的东西,也是这个道理。

要实现一个线程池是非常复杂的。比如说,一个线程在执行任务时产生了异常,这个线程就会丢失,池中可用的线程就少了一个,这种情况称为线程泄漏,当发生线程泄漏时,线程池需要重新补充一个线程进去。等等之类的问题都是实现一个线程池需要考虑的问题。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 whut_lcy 的回复:]

简单点,多线程是为了系统资源(西皮优,内存,总线等,但最主要的还是西皮优)得到更高效的使用,使得系统性能得到最大限度的发挥。多线程是操作系统在内核级实现(支持)的。

java作为一种编程语言的一种,提供了多线程的API,最终实现还是操作系统完成的。

玩过DOS吗?它是一种操作系统,单任务单用户。
如果你要把光驱里面的电影复制到硬盘,win下全选,然后拖过来,你可以看到好几个复制对话……
[/Quote]


西皮优
liujun822 2011-03-01
  • 打赏
  • 举报
回复
学习了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧