关于java中容器内外并发编程的疑问

zk1878 2014-05-20 10:29:15
在很多并发编程的书籍里,比如jvm并发编程,大多有这样的描述,对于计算密集型的代码,可以使用并发的方式提高效率,通常就是要多线程实现。比如计算某个范围内的素数个数,可以将该范围划分为若干份,然后交给线程来处理。

启动线程的个数应等于cpu核数,比如2核就开2线程。 这在非容器内运行(比如就在一个main方法里),我可以理解,因为非容器就是一个主线程,还有自己开启的工作线程。但如果在容器内(比如tomcat,swing桌面程序)中运行时,就有点疑惑,因为容器内一般都会有多个线程,线程池,这样的话对于以上的素数个数统计问题,在容器环境中,还使用多线程的方式,是否还有效率?望高人解答
...全文
143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2014-05-21
  • 打赏
  • 举报
回复
总体来说,就是要着眼于整个系统的大环境下,而不要纠结于一个进程之内。 比如,我有一个双核CPU的电脑,在上面并发执行四个几十G的视频转码任务,同时,再执行楼主的多线程CPU密集型任务。 你觉得,后面的任务,能用多高的效率? 再比如,同样的电脑,上面已经运行了将近一千个进程,(随便装他几十个大型应用类软件,再把所有的后台服务都启动,数量就差不多了),这个时候,启动一个JVM,再运行CPU密集型运算,这时的效率肯定也会有些偏低,因为,操作系统当前环境中的进程数量太多,进程切换、线程切换也要占一定的资源,从而影响CPU的使用。当然,这种极端的现象因人而异(是因机器而异),有很多人都不相信,以前单核、双核笔记本,实际使用中就会出现这种瓶颈。
冰思雨 2014-05-21
  • 打赏
  • 举报
回复
效率高低,不在于一个进程中是否存在其他线程,而在于其他线程都在干什么。 JVM进程启动的时候,一个进程中就已经启动了很多个线程了,其中包含垃圾回收线程。 如果进程中其他线程,都在做CPU密集型的任务,那么,你再做几个线程也来抢CPU的运行时间片,总的执行效率当然会降低。 但是,这种情况下,如果新建进程做CPU密集型任务,效率就会提高一些,因为你是在和其他进程抢CPU的时间片, 而不是抢一个进程中的CPU时间片。进程是系统资源分配的最小单位。 Tomcat容器里面会有线程池,但是,这些线程,通常情况下(没有负载时)都处于阻塞状态,如果有大量用户访问了上面的站点项目,或者,上面项目中有频繁的后台任务在执行,占用了较高的CPU使用频率,那么,最好的解决办法,就是换台服务器或者等服务器负载较低的时候,再执行CPU密集型的运算任务。
普凡 2014-05-20
  • 打赏
  • 举报
回复
启动线程的个数应等于cpu核数?什么意思

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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