首页 > 其他分享 >JUC-Executor

JUC-Executor

时间:2024-08-22 18:05:45浏览次数:11  
标签:JUC 接口 任务 Future 线程 Executor ExecutorService public

1,Executor框架相关内容

Executor 框架主要包括三部分内容

  1. 任务相关的:包含被执行的任务要实现的接口:Runnable接口或Callable接口

  2. 任务的执行相关的:包含任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架中有两个关键的类实现了ExecutorService接口(ThreadPoolExecutor和ScheduledThreadPoolExecutor)

  3. 异步计算结果相关的:包含接口Future和实现Future接口的FutureTask类

Executors框架包括:

  • Executor
  • ExecutorService
  • ThreadPoolExecutor
  • Executors
  • Future
  • Callable
  • FutureTask
  • CompletableFuture
  • CompletionService
  • ExecutorCompletionService

2, Executor接口

Executor接口中定义了方法execute(Runable able)接口,该方法接受一个Runable实例,他来执行一个任务,任务即实现一个Runable接口的类。

3,ExecutorService 接口

ExecutorService继承于Executor接口,他提供了更为丰富的线程实现方法,比如ExecutorService提供关闭自己的方法,以及为跟踪一个或多个异步任务执行状况而生成Future的方法。

ExecutorService有三种状态:运行、关闭、终止。创建后便进入运行状态,当调用了shutdown()方法时,便进入了关闭状态,此时意味着ExecutorService不再接受新的任务,但是他还是会执行已经提交的任务,当所有已经提交了的任务执行完后,便达到终止状态。如果不调用shutdown方法,ExecutorService方法会一直运行下去,系统一般不会主动关闭。

4,ThreadPoolExecutor

线程池类,是我们常用到到。参考 线程池

5,Executors-工具类

Executors类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口。常用的方法有:

//单线程线程池
public static ExecutorService newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)

//固定线程数的线程池
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)

//创建一个可缓存的线程池
public static ExecutorService newCachedThreadPool()
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)

//创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

这几种创建线程池的方法都是调用 ThreadPoolExecutor。

6,Future 结果

任务结果

7,Callable 接口

Callable 接口中定义了需要有返回的任务需要实现的方法。

Runnable 和 Callable 的区别:

1、最大的区别,runnable 没有返回值,而实现 callable 接口的任务线程能返回执行结果。

2、callable 接口实现类中的 call 方法允许异常向上抛出,可以在内部处理,try catch,但是 runnable 接口实现类中 run 方法的异常必须在内部处理,不能抛出。

callable 示例:

public void test() {
    Callable<String> callable = new Callable<String>() {
        @Override
        public String call() throws Exception {
            System.out.println(1/0);
            return "pz";
        }
    };
    FutureTask futureTask = new FutureTask(callable);
    Thread thread = new Thread(futureTask);
    thread.start();
    try {
        System.out.println(futureTask.get());
    }catch (Exception e){
        System.out.println(e.getMessage());
    }
}

runnable 示例:

public void runnableTest(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println(1);
        }
    }).start();
}

8,CompletionService 接口

CompletionService相当于一个执行任务的服务,通过submit丢任务给这个服务,服务内部去执行任务,可以通过服务提供的一些方法获取服务中已经完成的任务。

1,Future submit(Callable task)

用于向服务中提交有返回结果的任务,并返回Future对象

2,Future submit(Runnable task, V result);

用户向服务中提交有返回值的任务去执行,并返回Future对象

3,Future take() throws InterruptedException;

从服务中返回并移除一个已经完成的任务,如果获取不到,会一致阻塞到有返回值为止。此方法会响应线程中断。

4,Future poll();

从服务中返回并移除一个已经完成的任务,如果内部没有已经完成的任务,则返回空,此方法会立即响应。

5,Future poll(long timeout, TimeUnit unit) throws InterruptedException;

尝试在指定的时间内从服务中返回并移除一个已经完成的任务,等待的时间超时还是没有获取到已完成的任务,则返回空。此方法会响应线程中断

9,ExecutorCompletionService 接口

ExecutorCompletionService类是CompletionService接口的具体实现。

说一下其内部原理,ExecutorCompletionService创建的时候会传入一个线程池,调用submit方法传入需要执行的任务,任务由内部的线程池来处理;ExecutorCompletionService内部有个阻塞队列,任意一个任务完成之后,会将任务的执行结果(Future类型)放入阻塞队列中,然后其他线程可以调用它take、poll方法从这个阻塞队列中获取一个已经完成的任务,获取任务返回结果的顺序和任务执行完成的先后顺序一致,所以最先完成的任务会先返回。

10,CompletableFuture 接口

CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类。

  1. 在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。

  2. 它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。

  3. 它实现了Future和CompletionStage接口。CompletionStage 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。

api 介绍:

public static CompletableFuture runAsync(Runnable runnable)
public static CompletableFuture runAsync(Runnable runnable, Executor executor)

创建一个异步操作, 不支持返回值,不传入 executor 使用 ForkJoinPool.commonPool()

public static CompletableFuture supplyAsync(Supplier supplier)
public static CompletableFuture supplyAsync(Supplier supplier, Executor executor)

创建一个异步操作,支持返回值,不传入 executor 使用 ForkJoinPool.commonPool()

public CompletableFuture whenComplete(BiConsumer<? super T,? super Throwable> action)
public CompletableFuture whenCompleteAsync(BiConsumer<? super T,? super Throwable> action)
public CompletableFuture whenCompleteAsync(BiConsumer<? super T,? super Throwable> action, Executor executor)

结算结果完成回调方法,whenCompaete,在当前线程执行。whenCompleteAsync 继续交给线程池执行。

public CompletableFuture exceptionally(Function<Throwable,? extends T> fn)

出现异常执行。

其他方法参考

单独列一篇出来

标签:JUC,接口,任务,Future,线程,Executor,ExecutorService,public
From: https://www.cnblogs.com/cnff/p/17007081.html

相关文章

  • JUC-CompletableFuture 类
    1.CompletableFuture简介在Java中CompletableFuture用于异步编程,异步编程是编写非阻塞的代码,运行的任务在一个单独的线程,与主线程隔离,并且会通知主线程它的进度,成功或者失败。在这种方式中,主线程不会被阻塞,不需要一直等到子线程完成。主线程可以并行的执行其他任务。使用这种......
  • Java并发编程 - JUC介绍、JUC锁(公平锁、非公平锁、可重入锁/递归锁、自旋锁、Reentran
    Java并发编程中的java.util.concurrent(简称JUC)包提供了许多高级并发工具和类,使得开发人员能够更加方便地编写高性能的并发程序。下面将详细介绍JUC包中的一些锁相关的概念和类。JUC介绍java.util.concurrent包提供了许多高级并发工具类,包括但不限于Executor框架......
  • @Async使用ThreadPoolTaskExecutor 多线程
    SpringBoot中的线程池ThreadPoolTaskExecutor,@Async的使用线程池@Configuration@EnableAsyncpublicclassExcutorConfig{@Bean(name="ThreadPoolTaskExecutor")publicThreadPoolTaskExecutorThreadPoolTaskExecutor(){ThreadPoolTaskExecutorex......
  • ThreadPoolExecutor详解
    恰逢经济下行,鄙人工作、生活日趋艰难,原本美好的愿望,如今只能成为奢望。不知如何是好的我,只能精研近几年来因浮躁而荒废的知识。今天就想跟大家聊一个对我来讲看似熟悉实则陌生的工具——ThreadPoolExecutor。熟悉是因为在我负责的项目中它是一个出镜率最高演员;陌生是因为我对其......
  • JUC4-共享模型之内存
    目录Java内存模型(JMM)可见性退不出的循环解决方法可见性&原子性终止模式之两阶段终止模式同步模式之Balking有序性原理:指令级并行指令重排序优化支持流水线的处理器多线程下的问题原理:volatile如何保证可见性如何保证有序性double-checkedlockinghappens-befo......
  • JUC3-共享模型之管程
    目录共享带来的问题分析临界区CriticalSection竞态条件RaceConditionsynchronized解决方案语法1语法2线程八锁变量的线程安全成员变量和静态变量是否线程安全?局部变量是否线程安全?常用线程安全类MonitorJava对象头Monitor(监视器/管程)原理:synchronized轻量级......
  • 【JUC】读写锁+邮戳锁
    文章目录关于锁的面试题简单聊聊ReentrantReadWriteLock是什么?锁的演变读写锁案例读写锁特点锁降级案例演示为什么设计锁降级(源码分析)邮戳锁StampedLock(比读写锁更快的锁)邮戳锁是什么?它是由饥饿问题引出StampedLock的特点乐观读模式Code演示传统的读写锁模式----读的......
  • JUC锁-AQS源码解读
    JUC锁-Java8中AbstractQueuedSynchronizer源码解读分析总体介绍AbstractQueuedSynchronizer概述在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。所以很有必要好好......
  • jUC中的锁
    在JUC中可以使用synchronized关键字进行加锁如下所示Objectobject=newObject();synchronized(object){//TODO}synchronized关键字所加的锁是逐步升级的,顺序是无锁->偏向锁->轻量级锁->重量级锁、随着锁等级的提高,所带来的消耗也会越大。在介绍......
  • mybatis中BatchExecutor的使用
    这部分内容需要掌握mysql的sql执行流程和事务控制才能理解,可以参考下我的相关文章。mybatissql执行流程mybatis事务控制一、BatchExecutor的介绍BatchExecutor是mybatis提供的一个执行器,用于执行批量更新操作,性能上比使用foreach标签拼sql要高,使用方式上也更方便。BatchE......