Java 线程池通俗详解

一、关于线程池:

1.采用线程池的优点

  1. 重用存在的线程,减少对象创建、消亡的开销,性能佳 。
  2. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞 。
  3. 提供定时执行、定期执行、单线程、并发数控制等功能。

2.为什么引入线程池框架:

  1. new Thread()的缺点。
  2. 每次new Thread()耗费性能 。
  3. 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
  4. 不利于扩展,比如如定时执行、定期执行、线程中断。

二、关于线程池框架-Exexctor简介:

  1. Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。

  2. Executor的UML图:(常用的几个接口和子类)
    在这里插入图片描述
    1)Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command)。
    2)ExecutorService:是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法。
    3)AbstractExecutorService:ExecutorService执行方法的默认实现。
    4)ScheduledExecutorService:一个可定时调度任务的接口。
    5)ScheduledThreadPoolExecutor:ScheduledExecutorService的实现,一个可定时调度任务的线程池。
    6)ThreadPoolExecutor:线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。

  3. Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

  4. 通过Executors提供四种线程池,newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool。
    1)public static ExecutorService newFixedThreadPool(int nThreads)
    创建固定数目线程的线程池。
    在这里插入图片描述
    2)public static ExecutorService newCachedThreadPool()
    创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线 程并添加到池中,终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
    在这里插入图片描述
    3)public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
    创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
    在这里插入图片描述
    在这里插入图片描述
    4)public static ExecutorService newSingleThreadExecutor()
    创建一个单线程化的Executor。
    在这里插入图片描述

  5. Executor执行Callable任务
    1)​​​​在Java 5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。
    2)两者都可以被ExecutorService执行,但是Runnable任务没有返回值,而Callable任务有返回值。
    3)并且Callable的call()方法只能通过ExecutorService的submit(Callable task) 方法来执行。
    4)并且返回一个 Future,是表示任务等待完成的 Future。
    在这里插入图片描述

  6. 自定义线程池,可以用ThreadPoolExecutor类创建, 它有多个构造方法来创建线程池,用该类很容易实现自定义的线程池。
    在这里插入图片描述

总结:

在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API,Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。
因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值