聊聊并发(3):java线程池的分析和使用-java开发java经验技巧

聊聊并发(3):java线程池的分析和使用-java开发java经验技巧

ID:30849425

大小:61.50 KB

页数:7页

时间:2019-01-04

聊聊并发(3):java线程池的分析和使用-java开发java经验技巧_第1页
聊聊并发(3):java线程池的分析和使用-java开发java经验技巧_第2页
聊聊并发(3):java线程池的分析和使用-java开发java经验技巧_第3页
聊聊并发(3):java线程池的分析和使用-java开发java经验技巧_第4页
聊聊并发(3):java线程池的分析和使用-java开发java经验技巧_第5页
资源描述:

《聊聊并发(3):java线程池的分析和使用-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、聊聊并发(3):Java线程池的分析和使用-编程开发技术聊聊并发(3):Java线程池的分析和使用原文出处:方腾E本系列:聊聊并发(1)深入分析Volatile的实现原理聊聊并发(2)JavaSE1.6中的Synchronized1・???引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达吋,任务口J以不需要的等到线程创建就能立即执行。第三:提高线程的口J管理性。线程是稀缺资源,如杲无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用

2、线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。2.线程池的使用线程池的创建我们可以通过ThreadPoolExecutor来创建一个线程池。newThreadPoolExecutor(corePoolSize,maximumPoo1Size,kccpAlivcTime,mi11iseconds,runnablcTaskQucuc,thrcadFactory,handler);创建一个线程池需要输入儿个参数:•corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创

3、建-一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数人于线程池基木人小时就不再创建。如果调用了线程池的prestartAIICoreThreads方法,线程池会提前创建并启动所有基本线程。•runnablcTaskQucuc(任务队列):用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。1.ArrayBlockingQueue:是一个基于数组结构的冇界阻塞队列,此队列按FIFO(先进先出)原则对元素进行排序。2.LinkedBlockingQueue:一个基于链表结构的阻塞队列,

4、此队列按FIFO(先进先出)排序元索,吞吐量通常要高于ArrayBlockingQueue□静态工厂方法Executors.newFixedThreadPool()使用了这个队列。3.SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常耍鬲于LinkedBlockingQueue,静态IJ方法Executors.newCachedThreadPool使用了这个队列。4.PriorityBlockingQueue:一个具冇优先级得无限阻塞队列

5、。•maximumPoolSize(线程池最人人小):线程池允许创建的最人线程数。如果队列满了,并且己创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。值得注意的是如果使用了无界的任务队列这个参数就没什么效果。•ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字,Debug和定位问题吋非常又帮助。RejectedExecutionHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是Ab

6、ortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略。n?AbortPolicy:直接抛出异常。1.CallerRunsPolicy:只用调用者所在线程来运行任务。2.DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。3.DiscardPolicy:不处理,丢弃掉。4.当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录H志或持久化不能处理的任务。•keepAIiveTime(线程活动保持时间):线程池的工作线程空闲后,

7、保持存活的时间。所以如果任务很多,并且每个任务执行的时间比较短,可以调大这个时间,提高线程的利用率。•TimeUnit(线程活动保持时间的单位):XT选的单位有天(DAYS),小时(HOURS),分钟(MINUTES),毫秒(MILLISECONDS),微秒(MICROSECONDS,T分毫秒)和毫微秒(NANOSECONDS,千分Z—微秒)。向线程池提交任务我们口J以使用execute提交的任务,但是execute方法没冇返回值,所以无法判断任务知否被线程池执行成功。通过以下代码可知execute方法输入的任务是一个Runnab

8、le类的实例。threadsPool・execute(newRunnable(){©Overridepublicvoidrun(){//TODOAuto-generatedmethodstub}});我们也口J以使用submit?方法来提交任务,它

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。