A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhouguizhi 黑马帝   /  2011-9-30 02:12  /  1792 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

想问下多线程中线程池是怎么样
还有关于死锁的问题

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

2 个回复

倒序浏览
黑马网友  发表于 2011-9-30 07:54:20
沙发
线程池:
系统启动一个新线程的成本比较高,因为涉及到与操作系统交互。这个时候用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
原理:(流程)线程池和数据库连接池有点类似的是,线程池在系统启动时创建大量空闲线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该线程对象的run方法,当run方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲线程,等待执行下一个Runnable对象的run方法。
优点:使用线程池可以有效的控制系统中并发线程的数量,当系统中包含大量的并发线程时,会导致系统性能剧烈下降,甚至导致JVM的崩溃,而线程池的最大线程参数可以控制系统中并发线程数目不超过此数目。
在JDK1.5开始,提供Java内建的线程池,JDK提供一个Executors工厂类来产生线程池,该工程类包含如下几个静态工厂方法来创建连接池:
    A、newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中。
    B、newFixedThreadPool(int nThreads):创建一个可重用的、具有固定线程数的线程池
    C、newSingleThreadExecutor():创建一个只有单线程的线程池,它相当于newFixedThreadPool方法传递参数1
    D、newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它可以在指定延迟后执行线程任务,corePoolSize 指池中所保持的线程数,即使线程是空闲的也被保存在线程池内。
    E、newSingleThreadScheduiedExecutor():创建只有一条线程的线程池,它可以在指定延时后执行线程任务。
    以上5个方法的前三个方法返回的是一个ExecutorService对象,该对象代表一个线程池,它可以执行Runnable对象或Callable对象所代表的线程。
    而后两个方法返回一个ScheduledExecutorService线程池,它是ExecutorService的子类,它可以在指定延时后执行线程任务。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-30 10:11:29
藤椅
死锁不是一种知识,而是一种现象,是需要避免的,我用例子举例说明死锁是怎么发生的
在一家商场内有试衣间:A、B,有两个要试衣的人:甲、乙,当甲带着试衣间A的钥匙进入试衣间A,乙带着试衣间B的钥匙进入试衣间B后,甲得到指令,要立刻到试衣间B取一件重要的东西,由于试衣的过程并没有完全结束,所以甲带着钥匙前往试衣间B,乙同样得到一个指令,所以乙同时带着钥匙前往试衣间A。当甲到达试衣间B后,发觉门是关着的,乙也同样如此,我们都知道程序是不会后退执行的,所以甲乙两人在没有完成任务前,永远都会堵在门前,这就是死锁

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马