专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  Spring Boot 中使用 JSON ... ·  4 小时前  
芋道源码  ·  高性能、无侵入的 Java 性能监控神器 ·  4 小时前  
芋道源码  ·  Java面试,问八股文的面试官水平很次? ·  4 小时前  
芋道源码  ·  抱歉,最近我劝各位真的别轻易离职...... ·  昨天  
芋道源码  ·  一款轻便、安全、免费的远程桌面工具 ·  昨天  
51好读  ›  专栏  ›  ImportNew

多线程之线程池的应用

ImportNew  · 公众号  · Java  · 2017-02-21 22:07

正文

请到「今天看啥」查看全文



在java.util.concurrent包下,提供了一系列与线程池相关的类。合理的使用线程池,可以带来多个好处:


(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗;


(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行;


(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。


线程池可以应对突然大爆发量的访问,通过有限个固定线程为大量的操作服务,减少创建和销毁线程所需的时间。


使用线程池:


1.创建线程池


2.创建任务


3.执行任务


4.关闭线程池


一、创建线程池的方法


我们一般通过工具类Executors的静态方法来获取线程池或静态方法。介绍四种常用创建方法


ExecutorService executorService1 = Executors.newSingleThreadExecutor();


单例线程,表示在任意的时间段内,线程池中只有一个线程在工作…


ExecutorService executorService2 = Executors.newFixedThreadPool(10);


缓存线程池,先查看线程池中是否有当前执行线程的缓存,如果有就resue(复用),如果没有,那么需要创建一个线程来完成当前的调用.并且这类线程池只能完成一些生存期很短的一些任务.并且这类线程池内部规定能resue(复用)的线程,空闲的时间不能超过60s,一旦超过了60s,就会被移出线程池.


ExecutorService executorService3 = Executors.newScheduledThreadPool(10);


固定型线程池,和newCacheThreadPool()差不多,也能够实现resue(复用),但是这个池子规定了线程的最大数量,也就是说当池子有空闲时,那么新的任务将会在空闲线程中被执行,一旦线程池内的线程都在进行工作,那么新的任务就必须等待线程池有空闲的时候才能够进入线程池,其他的任务继续排队等待.这类池子没有规定其空闲的时间到底有多长.这一类的池子更适用于服务器.


ExecutorService executorService4 = Executors.newCacheThreadPool();


调度型线程池,调度型线程池会根据Scheduled(任务列表)进行延迟执行,或者是进行周期性的执行.适用于一些周期性的工作.


先看一个简单例子:


public class Executor {

public static void main(String[] args) {

//定义了线程池中最大存在的线程数目

ExecutorService executorService=Executors.newFixedThreadPool(10);

//添加了一个任务...

executorService.execute(new Runnable() {







请到「今天看啥」查看全文