Java多线程中的Executor详解

 更新时间:2023年12月06日 11:03:43   作者:小柴林  
这篇文章主要介绍了Java多线程中的Executor详解,该接口提供了一种将任务提交与如何运行每个任务的机制(包括线程使用、调度等细节)解耦的方法,它通常使用预先创建线程而不是创建线程,需要的朋友可以参考下

Java多线程中的Executor

定义了执行已提交Runnable任务的对象。该接口提供了一种将任务提交与如何运行每个任务的机制(包括线程使用、调度等细节)解耦的方法。它通常使用预先创建线程而不是创建线程。

例如new Thread(new(RunnableTask())).start() 每次都创建新线程来执行任务。

现在可以使用以下方式来执行任务:

Executor executor = anExecutor;
executor.execute(new RunnableTask1());

然而,Executor接口并不严格要求异步执行,在一个简易测试中,executor 可以在调用者的线程中立即运行提交的任务:

 class DirectExecutor implements Executor {
   public void execute(Runnable r) {
     //直接执行提交者任务
     r.run();
   }
 }

更典型的情况是,任务在调用者的线程之外的某个线程中执行。下面的执行程序为每个任务生成一个新线程。

 class ThreadPerTaskExecutor implements Executor {
   public void execute(Runnable r) {
     //创建新线程来执行任务
     new Thread(r).start();
   }
 }

许多Executor实现对如何以及何时调度任务施加了某种限制。下面的执行程序将任务的提交序列化到第二个执行程序,演示了复合执行程序。

class SerialExecutor implements Executor {
   final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
   final Executor executor;
   Runnable active;
 
   SerialExecutor(Executor executor) {
     this.executor = executor;
   }
 
   public synchronized void execute(final Runnable r) {
     //创建一个任务并存放到双端队列
     tasks.offer(new Runnable() {
       public void run() {
         try {
           r.run();
         } finally {
           scheduleNext();
         }
       }
     });
     //开启第一个任务
     if (active == null) {
       scheduleNext();
     }
   }
 
  
   protected synchronized void scheduleNext() {
     if ((active = tasks.poll()) != null) {
       executor.execute(active);
     }
   }
 }

ExecutorService接口拓展Executor功能,这是一个更广泛的接口。

ThreadPoolExecutor类提供可扩展的线程池实现。

Executors类提供了方便的工厂方法。

内存一致性效应:在将可运行对象提交给执行程序之前发生的线程操作——在它开始执行之前,可能在另一个线程中。

到此这篇关于Java多线程中的Executor详解的文章就介绍到这了,更多相关Java的Executor内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之中介模式

    Java设计模式之中介模式

    这篇文章主要介绍了Java设计模式之中介模式,中介模式(Mediator Pattern),属于行为型设计模式,目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类之间的通信复杂性,需要的朋友可以参考下
    2023-12-12
  • Spring依赖注入和控制反转详情

    Spring依赖注入和控制反转详情

    这篇文章主要介绍了Spring依赖注入和控制反转详情,控制反转是面向对象编程中使用的术语,通过该术语,对象或对象集的控制权被赋予框架或由框架提供的容器。下文更多相关内容需要的小伙伴可以参考一下
    2022-05-05
  • IDEA安装插件的两种方式详解

    IDEA安装插件的两种方式详解

    插件是开发工具的扩展程序,通常由第三方提供,当安装了插件后,原开发工作的菜单、按钮等开发环境可能会发生变化,本文通过图文给大家详细介绍了IDEA安装插件的两种方式,需要的朋友可以参考下
    2025-09-09
  • java的json解析类库使用示例

    java的json解析类库使用示例

    这篇文章主要介绍了java的json解析类库使用方法,这里使用Zson解析json,这是一个开源的json处理类库
    2014-03-03
  • java代理模式与动态代理模式详解

    java代理模式与动态代理模式详解

    代理就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用
    2014-02-02
  • http basic authentication通过post方式访问api示例分享 basic认证示例

    http basic authentication通过post方式访问api示例分享 basic认证示例

    在HTTP中,基本认证是一种用来允许Web浏览器或其他客户端程序在请求时提供以用户名和口令形式的凭证,这篇文章主要介绍了http basic authentication通过post方式访问api示例,大家参考使用吧
    2014-01-01
  • 浅析java实现数据加密问题

    浅析java实现数据加密问题

    本文通过实例代码给大家介绍了java实现数据加密问题,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • 浅谈mybatis-plus批量保存异常及效率优化

    浅谈mybatis-plus批量保存异常及效率优化

    本文主要介绍了mybatis-plus批量保存异常及效率优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • 浅谈SpringMVC中Interceptor和Filter区别

    浅谈SpringMVC中Interceptor和Filter区别

    这篇文章主要介绍了浅谈SpringMVC中Interceptor和Filter区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • 浅谈一下SpringCloud中Hystrix服务熔断和降级原理

    浅谈一下SpringCloud中Hystrix服务熔断和降级原理

    这篇文章主要介绍了浅谈一下SpringCloud中Hystrix服务熔断和降级原理,Hystrix 是 Netflix 的一款开源的容错框架,通过服务隔离来避免由于依赖延迟、异常,引起资源耗尽导致系统不可用的解决方案,需要的朋友可以参考下
    2023-05-05

最新评论