java并发编程实战-任务执行

1,在理想情况下,各个任务之间是相互独立的,任务并不依赖于其他任务的状态,结果或者边界效应。独立有助于实现并发。
2,大多数服务器应用程序都提供一种自然的任务边界选择方式,以独立的客户请求为边界,这样既可以实现任务的独立性,又可以实现合理的任务规模。
3,应用程序中可以通过多种策略来调度任务
  3.1,最简单的策略就是单个线程中串行地执行各项任务,这种策略无法提供高吞吐率或快速响应性,同时服务器资源利用非常低,因为IO和CPU总有一个会处于空闲状态
  3.2,通过为每个请求创建一个新的线程来提供服务,从而实现更高的响应性,如下:
    3.2.1,任务处理过程从主线程中分离出来,使得主线程能够在不等待上一个处理结束之前就可以处理下一次请求,从而提高程序响应性
    3.2.2,任务可以并行处理,从而能够同时服务多个请求,从而提高程序吞吐量
    3.2.3,任务处理代码必须是线程安全的,因为当有多个任务同时处理时,会并发地调用这段代码。
  3.3,无限制创建线程存在一些缺陷:
    3.3.1,线程生命周期的开销非常大。
    3.3.2,资源消耗:大量线程会占用许多内存,给GC带来压力;大量线程在竞争CPU资源时还将产生其他的性能开销
    3.3.3,稳定性:可创建线程的数据上存在一个限制:平台,JVM参数,Thread构造函数中请求的栈大小,操作系统对线程的限制等。如果创建的线程数量超过限制可能会抛出OM异常
4,Executor框架
  4.1,任务是一组逻辑工作单元,而线程则是使任务异步执行的机制。
  4.2,在Java类库中,任务执行的主要抽象不是Thread,而是Executor。
  4.3,该框架能支持多种不同的任务执行策略,它基于生产值-消费者模式提供一种标准的方法将任务的提交过程执行过程解耦开来,并用Runable来标致任务,它还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。
5,执行策略:通过将任务的提交与执行解耦开来,从而无需太大的困难就可以为某种类型的任务指定和修改执行策略。执行策略包括:
  5.1,在什么线程中执行任务
  5.2,任务按照什么顺序执行(FIFO,LIFO,优先级)
  5.3,有多少个任务能够并发执行
  5.4,队列中多少个任务等待执行
  5.5,如果系统由于过载需要拒绝服务,那么选择拒绝哪一个任务,如果通知应用程序有任务被拒绝
  5.6,在执行一个任务之前或之后,应该进行哪些动作
6,线程池:指管理一组同构工作线程的资源池。线程池优势:
  6.1,通过重用线程,从而降低线程创建和消费过程中的巨大开销
  6.2,当请求到达时,线程通常已经存在,从而减少了线程创建时间,提高了响应性
  6.3,通过调整线程池大小可以创建足够多的线程以保持服务器处于忙碌状态,同时还防止线程过多相互竞争资源导致应用程序耗尽内存或处理失败
7,Executor的生命周期
  7.1,Jvm只有在所有非守护线程全部终止后才会退出,因此如果无法正确的关闭Executor,那么JVM将无法结束
  7.2,Executor扩展了ExecutorService接口,提供了一些用于生命周期的管理方法
    7.2.1,shutdown方法:不再接受新任务,等待已提交任务执行完成(包括已提交还没执行的任务)
    7.2.2,shutdownNow方法:不再接受新的任务,尝试取消所有运行中的任务,不在启动队列中等待执行的任务
    7.2.3,awaitTermination方法,等待ExecutorService到达终止状态
8,延迟任务与周期任务
  8.1,Timer类负责管理延迟任务以及周期任务,但是Timer存在一些缺陷
    8.1.1,Timer在执行任务只会创建一个线程
    8.1.2,Timer线程不捕获异常,因此当TimerTask抛出未检查异常时终止定时线程,从而将整个Timer都取消了,因此已经被调度但尚未执行的TimerTask将不会再执行,新的任务也不能被调度(“线程泄露”)
  8.2,应该使用ScheduleThreadPoolExecutor来替代Timer类

  8.3,如果要构建自己的调度任务,可以使用DelayQueue,它实现了BlockingQueue,并未ScheduleThreadPoolExecutor提供调度功能。

9,找出可利用的并行性

  9.1,Executor框架使用Runnable作为其基本的任务表示形式,然而Runnable有局限性,它无法返回值或者抛出一个受检查异常
  9.2,Future框架使用的Callable可以给出返回值,或者抛出异常。get方法,如果任务没有完成,get将阻塞直到任务完成;如果任务已完成,则get将会立即返回值或者抛出一个Except,如果任务抛出异常那么get将该异常封装为ExecutionException并重新抛出;如果任务被取消,则get将抛出CancellationException。如果get抛出Exception,那么可以通过getCause来获取被封装的初始异常。
  9.3,ExecutorService中的所有submit方法都返回一个Future,从而将一个Runnable或者Callable提交给Executor,并得到一个Future用来获取任务执行的结果或者取消任务。
  9.4,将Runnable或者Callable提交到Executor的过程,以及通过Future的get获取计算结果的过程都包含了线程的安全发布
  9.5,CompletionService将Executor和BlockingQueue的功能融合在一起。ExecutorCompletionService实现了CompletionService,将计算部分委托给一个Executor,将结算结果保存到BlockingQueue。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值