美文网首页
线程池-任务提交

线程池-任务提交

作者: rock_fish | 来源:发表于2020-09-04 09:09 被阅读0次

任务提交有两种方式:

  • submit 提交Runable任务
  • execute 提交Callable任务
submit 提交Runable
  • 方式1 future返回null
    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }
  • 方式2 future返回指定结果
    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }
  • 方式3 future返回Callable的结果T
    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

跟入newTaskFor代码,再看 FutureTask的构造可知,以上三种方式都是将提交的任务转换为一个callable对象,包装到FutureTask实例中进行处理,感兴趣的runnable的返回结果处理是这样的:

    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }
    public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

callable 在创建RunnableAdapter

    public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        return new RunnableAdapter<T>(task, result);
    }

RunnableAdapter 里能看到call的执行逻辑,执行完run,返回result;

    static final class RunnableAdapter<T> implements Callable<T> {
        final Runnable task;
        final T result;
        RunnableAdapter(Runnable task, T result) {
            this.task = task;
            this.result = result;
        }
        public T call() {
            task.run();
            return result;
        }
    }
execute 提交Callable任务

当Callable对象构造完毕后,放入RunnableFuture实例中;FutureTask本身是Runnable接口,作为Executor接口中声明的execute方法的参数进行处理,必定会调用其run方法,看其实现:

  • FutureTask#run()
    简化以下其run方法的代码,可以看出会执行callable#call方法,并保存结果。
    public void run() {
            Callable<V> c = callable;
            result = c.call();
            set(result);
    }

相关文章

  • J.U.C之线程池04:源码解析-任务提交

    任务提交 线程池的创建仅仅只是创建了线程池的对象,要想线程池运行起来需要我们从提交给线程池。本章只分析任务提交给w...

  • JUC-(4)线程池(下)

    之前介绍了如何创建线程池以及创建线程池时各参数的意义.现在将如果提交任务到线程池中去执行. 提交任务 提交任务到线...

  • 线程池详解三:线程池执行过程以及关闭

    1. 向线程池提交任务 可以使用两个方法向线程池提交任务,分别是execute() 和 submit() 方法。 ...

  • 线程池

    线程池的实现原理当向线程池提交一个任务之后,线程池是如何处理这个任务呢?(1)线程池判断核心线程池里的线程是否都在...

  • Java线程池任务执行流程

    线程池任务执行流程: 当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中...

  • 线程池-任务提交

    任务提交有两种方式: submit 提交Runable任务 execute 提交Callable任务 submit...

  • ThreadPoolExecutor

    参数: corePoolSize 核心线程池大小 (1) 当线程池小于corePoolSize时,新提交任务将创建...

  • 线程池的实现原理

    当提交一个新任务到线程池时,线程池的处理流程如下: 1. 线程池判断核心线程池里的线程是否都在执行任务。如果不是,...

  • java线程池

    线程池的概念 简单来说线程池就是一个管理线程的池子,当我们有任务需要执行无需创建线程,只需要将任务提交到线程池即可...

  • 线程池的实现原理

    当提交一个新的任务到线程池时,线程池的处理流程: 1、线程池判断核心线程池里的线程是否都在执行任务,如果不是,则创...

网友评论

      本文标题:线程池-任务提交

      本文链接:https://www.haomeiwen.com/subject/cqrojktx.html