黑马程序员技术交流社区

标题: 多线程中锁的问题 [打印本页]

作者: zhouguizhi    时间: 2011-9-30 02:12
标题: 多线程中锁的问题
想问下多线程中线程池是怎么样
还有关于死锁的问题
作者: 匿名    时间: 2011-9-30 07:54
线程池:
系统启动一个新线程的成本比较高,因为涉及到与操作系统交互。这个时候用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
原理:(流程)线程池和数据库连接池有点类似的是,线程池在系统启动时创建大量空闲线程,程序将一个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的子类,它可以在指定延时后执行线程任务。
作者: 匿名    时间: 2011-9-30 10:11
死锁不是一种知识,而是一种现象,是需要避免的,我用例子举例说明死锁是怎么发生的
在一家商场内有试衣间:A、B,有两个要试衣的人:甲、乙,当甲带着试衣间A的钥匙进入试衣间A,乙带着试衣间B的钥匙进入试衣间B后,甲得到指令,要立刻到试衣间B取一件重要的东西,由于试衣的过程并没有完全结束,所以甲带着钥匙前往试衣间B,乙同样得到一个指令,所以乙同时带着钥匙前往试衣间A。当甲到达试衣间B后,发觉门是关着的,乙也同样如此,我们都知道程序是不会后退执行的,所以甲乙两人在没有完成任务前,永远都会堵在门前,这就是死锁




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2