您的位置:首页 > 其它

线程池---多线程学习笔记(三)

2015-08-30 21:22 267 查看

线程池产生原因:
创建很多线程造成的两个问题:
1.构建一个新的线程会涉及到与操作系统的交互,会消耗一定的系统资源,当使用完这些新创建的线程后,线程就会被销毁,然后当我们再创建的时候就会再次消耗系统资源,所以如果创建很多生命期很短的线程,就会消耗很大的系统资源,甚至给系统带来很大的压力。
2.现在不考虑重复创建很多线程造成的压力,单单从创建大量的线程并发执行任务这一点考虑,我们的系统能承受的线程数量是有限的,创建大量的线程会大大降低性能甚至是虚拟机崩溃。
所以这里为了解决创建多个线程造成的这两个问题是线程池的出生的意义。
线程池的作用:
1.减少重复创建线程造成的系统开销,线程池中的线程使用完后不会被销毁,当有新的任务时会继续使用线程池中的线程(除了只有一个线程的线程池(newSingleThreadExecutor),其他的线程池都有这种效果)
总而言之,减少线程创建,线程销毁所用的时间,当很多线程在线程池中运行完毕后,不会简单的将这些线程销毁,而是等待有新的任务过来之后,从线程池中拿出之前已经用过的线程,重复运行执行新的任务。
线程池的种类:
线程池的接口:ExecutorService
Executor类提供了四种线程池(这四种方法都是静态方法):
(1)newCachedThreadPool():(带缓存的线程池)
必要时创建新线程;空闲线程会被保留60s
(2) newFixedThreadPool():(固定数量线程的线程池)
该线程池中的线程数量有参数决定
(3)newSingleThreadExecutor():(单个线程的线程池)
它在一个单个的线程中依次执行各个任务
(4)newScheduledThreadPool():(可控制延迟时间或者周期执行线程的线程池)
具体四个线程池的介绍:
newCachedThreadPool():该方法构建了一个线程池,对于每个任务,如果有空闲线程可用,立即让它执行任务,如果没有可用的空闲线程,则创建一个新线程。也就是说,当线程池中的线程比较多,超出了我们任务所需的线程数量,许多线程就会空闲下来,这个线程池就会把空闲的线程回收,当任务增多了,线程池就会智能的从线程池中把线程拿出来使用。(线程池的大小不固定,跟系统能支持的线程数量有关)。
newFixedThreadPool(int i):该方法构建一个具有固定大小的线程池,如果提交的任务数多于空闲的线程数,那么把得不到服务的任务放置到队列中。当其他任务完成之后在运行它们。
newSingleThreadExecutor():是一个退化了的大小为1的线程池:有一个线程执行提交的任务,一个接一个,相当于排队执行任务,先来先执行。
newScheduledThreadPool():周期性的,定时的执行某些任务,该线程池中的线程的数量没有固定,相当于无限大。
线程池的使用方法:
只需要将待执行的任务放到run()方法中即可,将Runnable接口的实现类交给线程池的execute方法,作为它的一个参数。

Executor executor = Executors.newFixedThreadPool(6);
executor.execute(new Runnable(){
public void run(){
//执行的任务
}
}

当用完一个线程池的时候,调用shutdown()方法,该方法启动该池的关闭序列,会先完成已经提交的任务而不再接收新的任务。(也可以调用shutdownNow()方法,那么取消该线程池中的尚未开始的所有任务并试图中断正在运行的线程)

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: