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

一: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入参Runnablesubmit入参可以为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);  ...}