Java 并发编程:任务执行器 Executor 接口

Wesley13
• 阅读 853

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

Java 并发编程:任务执行器 Executor 接口

同步执行器

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

Java 并发编程:任务执行器 Executor 接口

一对一执行器

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

Java 并发编程:任务执行器 Executor 接口

线程执行器

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

Java 并发编程:任务执行器 Executor 接口

串行执行器

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

Java 并发编程:任务执行器 Executor 接口

总结

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

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 面试知识点笔记(十三)多线程与并发
java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.
Wesley13 Wesley13
3年前
java executor
在java.util.concurrent包中的ExecutorService的实现就是壹個线程池的实现任务的委托(TaskDelegation)壹旦线程把任务委托给ExecutorService,该线程就会继续执行与运行任务无关的其它任务。Executor框架的两级调度模型在HotSpotVM的线程模型中,Java线程
Stella981 Stella981
3年前
Executor线程池
线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。_0_|_1_线程实现方式Thread、Runnable、Callable//实现Runnable接口的类将被Thread执行,表示一个基本任务p
Stella981 Stella981
3年前
Executor框架
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制。线程池简化了线程的管理工作,并且java.util.concurrent提供了一种灵活的线程池实现作为Executor框架的一部分。在Java类库中,任务执行的主要抽象不是Thread,而是Executor,如下所示:publicinterfaceExecutor{void
Stella981 Stella981
3年前
ExecutorService 线程池 (转发)
1.ExecutorServicejava.util.concurrent.ExecutorService接口。用来设置线程池并执行多线程任务。它有以下几个方法。Future<?java.util.concurrent.ExecutorService.submit(Runnabletask)提交任务并执行,返回代表这个任务的future
Stella981 Stella981
3年前
AsyncTask 工作原理分析
AsyncTask相信大家对他的使用并不陌生,它是谷歌官方提供的一种轻量级别的异步任务类,底层封装的是两个线程池和一个Handler.sDefaultExecutorSERIAL\_EXECUTOR用来Runnable排队用的,THREAD\_POOL\_EXECUTOR是用来真正执行任务的.我们先从execute()开始分析,execute
Wesley13 Wesley13
3年前
Java变成思想
Executor:线程池CatchedThreadPool:创建与所需数量相同的线程,在回收旧线程是停止创建新县城。FixedThreadPool:创建一定数量的线程,所有任务公用这些线程。SingleThreadPool:线程数量为1的FixedThreadPool,并且执行有序。如果需要得到线程返回值,要实现Callbale接口
Stella981 Stella981
3年前
Executor框架(二)Executor 与 ExecutorService两个基本接口
一、Executor接口简介Executor接口是Executor框架的一个最基本的接口,Executor框架的大部分类都直接或间接地实现了此接口。只有一个方法voidexecute(Runnablecommand):在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由Execut
ThreadPoolExecutor线程池内部处理浅析 | 京东物流技术团队
我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务。本文主要通过java的ThreadPoolExecutor来查看线程池