线程池submit和execute区别有哪些?

TheDisguiser 2020-05-31 13:37:38 java常见问答 9435

小伙伴们知道线程池submit和execute的区别都有哪些嘛?它们都是java线程池中较常用的,下面就让我们一起来看看它们有哪些区别吧。

一、返回值类别

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,也可以为Runnable。

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);
  ...
}

以上就是关于submit和execute的之间区别的所有内容了,关于它们的更多相关java常见问答知识请关注我们来了解详情吧。

推荐阅读:

线程池大小一般设计成cpu多少倍为好?CPU性能详解

java线程池参数设置原则,如何设置线程池参数比较合理?

java线程池的作用是什么?线程池介绍