Java线程池中submit()和execute之间的区别?

Posted 西北野狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程池中submit()和execute之间的区别?相关的知识,希望对你有一定的参考价值。

一:
submit()方法,可以提供Future < T > 类型的返回值。
executor()方法,无返回值。

execute无返回值

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();//抛掉异常
        int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

submit有Future返回值 :

/**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    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;
    }

    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

二:
excute方法会抛出异常。
sumbit方法不会抛出异常。除非你调用Future.get()。


三:
excute入参Runnable
submit入参可以为Callable

public interface Executor {
    void execute(Runnable command);
}
public interface ExecutorService extends Executor {
  ...
  <T> Future<T> submit(Callable<T> task);
 
  <T> Future<T> submit(Runnable task, T result);
 
  Future<?> submit(Runnable task);
  ...
}






以上是关于Java线程池中submit()和execute之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

线程池中execute和submit的区别

线程池的submit和execute方法区别

线程池的submit和execute方法区别

线程池的submit和execute方法区别

ExecutorService.submit()与Executor.execute()的区别

Java线程池submit阻塞获取结果实现原理