第六章 任务执行

6.1 在线程中执行任务

  围绕任务执\执行设计应用程序结构 .讲一个复杂的功能分解为多个独立的任务. 并可以并行执行, 在调度和负载均衡过程中实现更高的灵活性.

6.1.1 串行的执行任务

  在单个线程中串行的执行各项任务.

6.1.2 显示的创建任务

  正常负载情况下, 为每个任务分配一个线程可以提升串行执行能力.

6.1.3 无限制创建线程的不足

  • 线程生命周期的开销非常高.
  • 资源消耗 . 活跃的线程会消耗系统资源 , 尤其是内存 .
  • 可创建的线程数量存在限制.

6.2 Executor框架

  任务:一组逻辑工作单元

  线程:使任务异步执行的机制

  Excutor 的优点 :

  • 支持多种不同类型的任务执行策略
  • 典型的生产者--消费者模式, 将任务提交和任务执行解耦
  • 提供对生命周期的支持
  • 统计信息收集, 应用程序管理机制, 性能监视机制

6.2.2 执行策略

  • 在什么线程中执行任务
  • 按照什么顺序执行(FIFO , LIFO , 优先级)
  • 有多少个任务可以并发执行
  • 队列中有多少个任务在等待执行
  • 需要拒绝任务时如何选择 , 并进行通知
  • 执行任务前后应该进行哪些动作

6.2.3 线程池

  管理一组同构(多个相同类型的物体参与完成某一件事情)工作线程的资源池

  优势 :

  • 通过重用现有的线程节省创建线程的开销
  • 提前创建线程, 节省等待时间 . 提高响应性
  • 通过调整线程池的大小充分合理的利用CPU资源

6.2.4 Excutor 的生命周期

  • 异步方式执行任务

  ExecutorService :

  • 生命周期有3中状态 : 运行 , 关闭 , 已终止.
  • 关闭方式

    方式一 :shutDown : 执行平缓的关闭过程 : 不再接受新的任务 , 同时等待提交的任务执行完成.

    方式二:shutDownNow : 取消所有运行的任务 , 并不再启动尚未执行的任务

  • 所有任务完成后 ExecutorService 转入终止状态

6.2.5 延迟任务与周期任务

  Timer

  • 基于绝对时间的调度机制( ScheduledThreadPoolExecutor 基于相对时间的调度机制)

    比如 某个任务延时300S 后执行, 它就会在 当前毫秒数+延时时间 的那个时刻去执行, 通过修改系统的时间就可以影响任务的执行时间

public void schedule(TimerTask task, long delay) {
        if (delay < 0)
            throw new IllegalArgumentException("Negative delay.");
        sched(task, System.currentTimeMillis()+delay, 0);
    }
  • 执行所有的定时任务时只会创建一个线程. 如果某个任务执行时间过长将会破坏其他任务的定时准确性
  // 线程队列
    private final TaskQueue queue = new TaskQueue();
    // 执行队列任务的线程
    private final TimerThread thread = new TimerThread(queue);
  • Timer的执行任务的线程不会捕获异常, 如果 timerTask 抛出异常, 将会终止 Timer 的线程.(线程泄露)

6.3 并行性

6.3.1 携带任务结果的Callable 与 Future

  Callable 类似与Runnable接口, 但是它可以有返回值,并可以抛出异常

  Future 异步计算的结果 通过Future的get()获取call() 方法的返回值

6.3.2 CompletionService

  • 使用指定的 Execotor 执行计算任务
  • 使用 BlockingQueue 保存计算结果.
  • 调用 API 获取计算结果时,若任务尚未完成则阻塞

原文地址:https://www.cnblogs.com/virgosnail/p/9446520.html

时间: 2024-11-02 21:18:25

第六章 任务执行的相关文章

数据库系统实现 第六章 查询执行

第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析:构造分析树,用来表达查询和它的结构 b)查询重写,分析树被转化为初始查询计划,通常是代数表达式,之后初始的查询计划会被优化为一个时间更小的计划 c)物理计划生成,将查询计划转化成物理的计划, 为了选择更好的查询计划,需要判断 1)查询哪一个代数的等价形式是最有效的 2)对选中形式的每一个操作,所使用的算法选

第六章——根据执行计划优化性能(1)——理解哈希、合并、嵌套循环连接策略

原文:第六章--根据执行计划优化性能(1)--理解哈希.合并.嵌套循环连接策略 前言: 本系列文章包括: 1. 理解Hash.Merge.Nested Loop关联策略. 2.在执行计划中发现并解决表/索引扫描. 3. 介绍并在执行计划中发现键查找并解决它们. 对于性能优化,需要集中处理以下的问题: 1. 为你的环境创建性能基线. 2. 监控现在的性能并发现瓶颈. 3. 解决瓶颈以便得到更好的性能. 一个预估执行计划是描述查询将会如何执行的一个蓝图,而一个实际执行计划就是一个查询执行时实际发生的

第六章——根据执行计划优化性能(3)——键值查找

原文:第六章--根据执行计划优化性能(3)--键值查找 前言: 本文为本系列最后一篇,介绍键值查找的相关知识. 键值查找是具有聚集索引的表上的一个书签查找,键值查找用于SQLServer查询一些非键值列的数据.使用非聚集索引的查询不会有键值查找,但是所有键值查找会伴随非聚集索引出现.这里特别提醒的是键值查找总是伴有嵌套循环关联. 准备工作: 下面将创建一个表,通过执行计划看看键值查找的不同效果.为了产生键值查找,需要两件事情: 1.  聚集索引 2.  非聚集索引 当你在非聚集索引键值上有谓词时

第六章——根据执行计划优化性能(2)——查找表/索引扫描

原文:第六章--根据执行计划优化性能(2)--查找表/索引扫描 前言: 在绝大部分情况下,特别是从一个大表中返回少量数据时,表扫描或者索引扫描并不是一种高效的方式.这些必须找出来并解决它们从而提高性能,因为扫描将遍历每一行,查找符合条件的数据,然后返回结果.这种处理是相当耗时耗资源的.在性能优化过程中,一般集中于: 1.  CPU 2.  Network 3.  磁盘IO 而扫描操作会增加这三种资源的开销. 准备工作: 下面将创建两个表来查看不同的物理关联操作的不同影响.创建脚本已经在本系列的第

第六章 javaScript执行环境和作用域

这个只是点对于初学者其实大概了解就可以,但是要研究明白javaScript的机制,就是非常必要的,这只是我的一些记录,大家参考即可,如有错误请指出. 执行环境的概念是javaScript一个虚拟的概念,如何定义它呢?它的作用又是什么呢?它是怎么组成的呢? 大家都比较认可的说法:执行环境又称为执行上下文,从实际的表现来看,可以把它理解为由“对象”组成的一个堆栈.既然是堆栈,就是先入后出了. 组成堆栈的对象是什么对象?我没有找到确切的定义,基于我自己的理解,这个对象是一个自定义对象,里边包含有变量.

[Java 并发] Java并发编程实践 思维导图 - 第六章 任务执行

根据<Java并发编程实践>一书整理的思维导图.希望能够有所帮助. 第一部分: 第二部分: 第三部分:

第六章:异常机制

第六章:异常机制 异常的定义 异常:在程序运行过程中出现的意外事件,导致程序中断执行. 异常处理 try...catch 语法:try{ //可能出现异常的代码}catch(异常类型 异常对象名){ //处理异常的代码:}执行过程:当try中的代码异常发生时抛出一个异常对象,该异常对象与catch中异常类型进行匹配,匹配成功进入catch块,否则不执行catch中代码(相当于异常未被处理).程序只有当异常处理成功后才能继续执行. try...catch...catch 语法:try{ //可能出

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

C Primer Plus (第五版) 第十六章 C预处理器和C库 编程练习

第十六章 C预处理器和C库 开发一个包含您需要使用的预处理器定义的头文件 //max.h  #ifndef _MAX_H_     #define _MAX_H_     #define MAX(X, Y) ((X)>(Y)?(X):(Y)) #endif 2.两个数的调和平均数可用如下方法得到:首先对两数的倒数取平均值,最后再取倒数.使用#define指令定义一个宏"函数"执行这个运算.编写一个简单的程序测试该宏. #include <stdio.h> #defin