本帖最后由 qemperor 于 2011-03-01 10:17:26 编辑

解决方案 »

  1.   

    并不是很正确。线程池主要是为了线程的重用而存在的。虽然对我们来说只要 new Thread(xxx).start() 就可以启动一个线程了,但是 JVM 和操作系统却要为此做出大量的工作,而且这种线程操作在完成后就被 JVM 和操作系统回收了。这样的话,导致系统花了很大的精力做了几秒钟的事情就将其回收了,不知道大家感觉怎么样,我感觉这种比较亏。所以线程池的概念就出来了,new Thread 执行完一个任务后,并不是将其扔掉,而是将其放回线程池中,为下一个任务做准备。我不知道你知不知道有一个称为数据库连接池的东西,也是这个道理。要实现一个线程池是非常复杂的。比如说,一个线程在执行任务时产生了异常,这个线程就会丢失,池中可用的线程就少了一个,这种情况称为线程泄漏,当发生线程泄漏时,线程池需要重新补充一个线程进去。等等之类的问题都是实现一个线程池需要考虑的问题。
      

  2.   

    线程池也有你所说的功能,因为操作系统对于一个进程所能开启的线程数量是有限制的,一般不会超过 2000 个,如果都是使用 new Thread#start 的话,而且执行的任务都很耗时,在请求量大时,系统资源就会耗尽,导致 JVM 崩溃。线程池可以限制最大可以执行的任务数量,超过数量限制的任务就必须等待。
      

  3.   

    简单点,多线程是为了系统资源(西皮优,内存,总线等,但最主要的还是西皮优)得到更高效的使用,使得系统性能得到最大限度的发挥。多线程是操作系统在内核级实现(支持)的。java作为一种编程语言的一种,提供了多线程的API,最终实现还是操作系统完成的。玩过DOS吗?它是一种操作系统,单任务单用户。
    如果你要把光驱里面的电影复制到硬盘,win下全选,然后拖过来,你可以看到好几个复制对话框弹出来,同时复制。这是因为win的explorer(资源管理器)是多线程的。dos下呢?
    copy f:\movie\*.rmvb  d:\bak这个命令也是复制所有的,但是复制的是一个一个复制的。相比之下的差别就不言而喻了