当前位置: 代码迷 >> J2SE >> 关于java中器皿内外并发编程的疑问
  详细解决方案

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

热度:60   发布时间:2016-04-23 20:37:07.0
关于java中容器内外并发编程的疑问
 在很多并发编程的书籍里,比如jvm并发编程,大多有这样的描述,对于计算密集型的代码,可以使用并发的方式提高效率,通常就是要多线程实现。比如计算某个范围内的素数个数,可以将该范围划分为若干份,然后交给线程来处理。

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