Java并发之任务执行

1 单个线程中串行地执行任务
—缺点:服务器的响应慢、吞吐量低、资源利用率低。(I/O阻塞、网络拥塞等问题造成)
—适合于任务数量很少且执行时间很长,或者当服务器只为单个用户提供服务而该用户每次只发出一个请求的情况。

2 为每个请求创建一个新的线程来提供服务
— 优点:
· 带来更快的响应性:将任务处理过程从主线程中分离出来,使得程序在完成前面的请求之前可以接受新的请求,从而提高响应性。
· 更高的吞吐率:任务可以并行处理,从而能服务多个请求。如果有多个处理器或者任务由于某种原因(如等待I/O完成、获取锁等)被阻塞,程序的吞吐量将得到提高。
—由于使用了多线程,因此任务处理代码必须是线程完全的。
—不足:
· 线程生命周期的开销非常高。线程的创建与销毁并不是没有代价的。
· 资源消耗。活跃的线程会消耗系统资源,尤其是内存。如果可运行的线程数量多余可用处理器的数量,那么闲置的线程会占用系统资源;而且,大量线程在竞争CPU资源时还会产生其他的性能开销。
· 稳定性。在可创建线程的数量上存在一个限制。这个限制值随平台的不同而不同,并且受多个因素制约,包括JVM的启动参数、Thread构造函数中请求的栈大小、底层操作系统对线程的限制等。

3 Executor框架
—Executor是个接口,为灵活且强大的异步任务执行框架提供了基础,能支持多种不同类型的任务执行策略。它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务。Executor的实现还提供了对生命周期的支持,以及统计信息收集、应用程序管理机制和性能监视等机制。
—Executor基于生产者-消费者模式。
(1)线程池
—线程池是指管理一组同构工作线程的资源池。线程池是与工作队列密切相关的,其中在工作队列中保存了所有等待执行的任务。工作者线程的任务为:从工作队列中获取一个任务——执行任务——返回线程池并等待下一个任务。
—和为每一个任务分配一个线程相比,在线程池中执行任务的优势是:
· 通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。
· 当请求到达时,工作线程通常已经存在,因此不会由于等待创建线程而延迟任务的执行,从而提高了响应性。
· 可以创建足够多的线程以便使处理器保持忙碌状态,同时还可以防止过多线程相互竞争资源而使应用程序耗尽内存或失败。
—从“为每个任务分配一个线程”策略变成基于线程池的策略,将对应用程序的稳定性产生重大的影响:
· Web服务器不会在高负载情况下失败。
· 由于服务器不会创建数千个线程来争夺有限的CPU和内存资源,因此服务器的性能将平缓地降低。
· 通过使用Executor,可以实现各种调优、管理、监视、记录日志、错误报告和其他功能,如果不使用任务执行框架,那么要增加这些功能是非常困难的。
(2)Executor 的生命周期
—Executor扩展了ExecutorService接口,添加了一些用于生命周期管理的方法。
—ExecutorService的生命周期有3种状态:
· 运行:初始化创建时处于运行状态。
· 关闭:shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已提交的任务执行完成(包括那些还未开始执行的任务);shutdownNow方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。
· 已终止:等所有任务都完成后,ExecutorService将转入终止状态。可以通过调用awaitTermination来等待ExecutorService到达终止状态,或者通过调用isTerminated来轮询ExecutorService是否已经终止。
(3)延迟任务与周期任务
—Timer类负责管理延迟任务(“在100ms后执行该任务”)以及周期任务(“每10ms执行一次该任务”)。
—Timer类的问题:
· Timer在执行所有定时任务时只会创建一个线程。如果某个任务的执行时间过长,那么将破坏其他TimeTask的定时精确性。
· 如果TimeTask抛出了一个未检查的异常,那么Timer将表现出糟糕的行为。Timer线程并不捕获异常,因此当TimeTask抛出未检查的异常时将终止定时线程。这种情况下,Timer也不会恢复线程的执行,而是会错误地认为整个Timer都被取消了。因此,已经被调度但尚未执行TimeTask将不会再执行,新的任务也不能被调度(“线程泄露”)。
—替代选择:ScheduledThreadPoolExecutor。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值