任务执行器(Executor)是一个接口,位于java.util.concurrent包下,它的作用主要是为我们提供任务与执行机制(包括线程使用和调度细节)之间的解耦。比如我们定义了一个任务,我们是通过线程池来执行该任务,还是直接创线程来执行该任务呢?通过Executor就能为任务提供不同的执行机制。执行器的实现方式各种各样,常见的包括同步执行器、一对一执行器、线程池执行器、串行执行器等等。下面我们将分别介绍这四种执行器,以帮助我们来理解执行器概念。

同步执行器

同步执行器是最简单的执行器,提交给它的任务将由调用线程直接执行,不需要其它线程的帮忙。如下演示代码中,DirectExecutor继承了Executor,它的execute方法直接调用了Runnable的run方法。我们在主线程中创建DirectExecutor对象后执行MyTask任务,实际上该任务将由调用线程(主线程)直接执行,最终输出executing task…。

一对一执行器

一对一执行器就是一个任务由一个线程负责,每个任务提交给执行器时都将创建一个新的线程来执行该任务。如下代码中,ThreadPerTaskExecutor的execute方法会新建一个线程执行任务。

线程执行器

线程池执行器就是拥有线程池功能的执行器,任务提交后将由线程池负责执行。我们将自己模拟实现一个简单的线程池,ThreadPoolExecutor类包含了任务队列taskQueue和十个工作线程workers,构造函数中会创建十个线程并通过while(true)循环不断从任务队列中取出任务并执行。而execute方法则是将任务添加到任务队列中,然后工作线程会执行任务队列中的任务。

串行执行器

串行执行器是一种具有串行功能的执行器,所有任务被加入到一个先进先出队列中,然后内部的另外一个执行器会按照队列的顺序执行任务。前一任务执行完后负责启动后一任务的执行,这样就形成了串行。我们看下简单的实现,SerialExecutor类中包含了一个任务队列和执行器,这里使用ThreadPerTaskExecutor执行器。SerialExecutor的execute方法负责将任务加入到队列中,而且还负责开启第一个任务的执行。finally块主要负责启动下一个任务,从而形成环环相扣。

总结

Executor只是一个接口,它提供了任务和执行的解耦机制。我们分析了几种常见执行器的实现,实际工程上可以根据自己实际情况来设计实现任务执行器。JDK也为我们提供若干有用的执行器,后面有机会我们将对其进行分析。

java执行器是什么_Java 并发编程:任务执行器 Executor 接口相关推荐

  1. java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...

  2. java中解决脏读_java并发编程学习之脏读代码示例及处理

    使用interrupt()中断线程     当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即 ...

  3. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  4. java线程本地变量_Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称 ...

  5. java程序使用异步总线_JAVA并发编程基础

    CPU核心 核心(Die)又称为内核,是CPU最重要的组成部分.CPU中心那块隆起的芯片就是核心,是由单晶硅以一定的生产工艺制造出来的,CPU所有的计算.接受/存储命令.处理数据都由核心执行.各种CP ...

  6. java queue 线程安全_java并发编程之线程安全方法

    线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...

  7. java等待5秒_Java并发编程-主线程等待子线程解决方案

    主线程等待所有子线程执行完成之后,再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.ou ...

  8. java 对象 线程安全_JAVA并发编程学习:构造线程安全的对象

    设计线程安全的类 实例限制 当一个对象被另一个对象封装时,所有访问被被封装对象的代码路径就是全部可知的,这相比于让对象可被整个系统访问来说,更容易对代码路径进行分析.将数据封装在对象内部,把对数据的访 ...

  9. java 等待几秒_Java并发编程synchronized相关面试题总结

    说说自己对于synchronized关键字的了解 synchronized关键字用于解决多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个 ...

最新文章

  1. 成功人士不用睡觉吗?
  2. linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了
  3. ASP.NET aspx页面中 写C#脚本; ASP.NET 指令(%@%);
  4. 使用OpenCV进行相机校准
  5. 源码免杀处理的技巧与tips
  6. 字典树模板+洛谷P2580 于是他错误的点名开始了
  7. mysql一次更新内容大于4M时报错修改max_allowed_packet变量
  8. 编译型语言VS解释型语言、动态语言、静态语言
  9. zabbix从入门到精通之---Zabbix proxy的配置(一)
  10. DEA博弈交叉效率matlab,基于DEA/AR博弈交叉效率方法的学术期刊评价研究
  11. 未明学院:还没入职就被“裁员”,大批应届生遭千亿巨头强制解约! Sorry,秋招 Offer 我们决定撤回…
  12. 起早贪黑几个月,我写完了人生第一本书!
  13. 51单片机LCD1602液晶屏调试工具
  14. import java util_java里面import java.util.*;是什么用处?
  15. 深度分享Windows11系统全新4K高清壁纸
  16. 大学计算机教育国外著名教材系列 数据结构,经典数据结构(Java语言版)(影印版)——大学计算机教育国外著名教材系列...
  17. 最近经常看到网上程序员被抓,如何避免面向监狱编程!?
  18. iOS中打一个包上传后,iTunes中找不到上传的包的解决方法
  19. 微信小程序获取用户昵称和头像
  20. C语言实现Prim算法与Kruskal算法(浙大 陈越版)

热门文章

  1. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR... 2011年08月05日 09:08:15
  2. 【番外篇1】青龙面板中cron表达式新手入门教程cron的介绍与使用
  3. java通过ftp方式上传_通过FTP以Java方式上传文件
  4. 版式文件 流式文件_银河麒麟操作系统V10全面适配各类流式版式软件
  5. java中利用框架传入相同的url实现crud操作_还在手写CRUD代码?这款开源框架助你解放双手!
  6. 再谈应用环境下的TIME_WAIT和CLOSE_WAIT
  7. Linux strace 跟踪进程信息
  8. java框架知识_java框架知识点总结
  9. onbeforeedit和onbeginedit数据不一致_Redis缓存与数据库产生不一致的问题该如何解决?...
  10. 帷幕的帷是什么意思_俗语:“宁娶寡妇,不娶生妻!”什么是“生妻”?老祖宗智慧...