スレッドプールThreadPoolExecuterにおけるsubmitメソッドとexecuteメソッドの違いと関係

5363 ワード

ThreadPoolExecutorは、AbstractExecutorServiceを継承するスレッドプールです.次のコードがあります.
package java.util.concurrent;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadPoolExecutor extends AbstractExecutorService {
	private final AtomicInteger ctl = new AtomicInteger(ctlOf(-536870912, 0));
	private static final int COUNT_BITS = 29;
	private static final int CAPACITY = 536870911;
	private static final int RUNNING = -536870912;
	private static final int SHUTDOWN = 0;
	private static final int STOP = 536870912;
	private static final int TIDYING = 1073741824;
	private static final int TERMINATED = 1610612736;
	private final BlockingQueue workQueue;

	private static int runStateOf(int paramInt) {
		return paramInt & 0xE0000000;
	}

	private static int workerCountOf(int paramInt) {
		return paramInt & 0x1FFFFFFF;
	}

	private static int ctlOf(int paramInt1, int paramInt2) {
		return paramInt1 | paramInt2;
	}

	private static boolean runStateLessThan(int paramInt1, int paramInt2) {
		return paramInt1 < paramInt2;
	}

	private static boolean runStateAtLeast(int paramInt1, int paramInt2) {
		return paramInt1 >= paramInt2;
	}

 
 
AbstraactExecutorServiceは、次のコードでExecutorServiceインタフェースを実装します.
package java.util.concurrent;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public abstract class AbstractExecutorService implements ExecutorService {
	protected  RunnableFuture newTaskFor(Runnable paramRunnable, T paramT) {
		return new FutureTask(paramRunnable, paramT);
	}

	protected  RunnableFuture newTaskFor(Callable paramCallable) {
		return new FutureTask(paramCallable);
	}

	public Future> submit(Runnable paramRunnable) {
		if (paramRunnable == null) {
			throw new NullPointerException();
		}
		RunnableFuture localRunnableFuture = newTaskFor(paramRunnable, null);
		execute(localRunnableFuture);
		return localRunnableFuture;
	}

	public  Future submit(Runnable paramRunnable, T paramT) {
		if (paramRunnable == null) {
			throw new NullPointerException();
		}
		RunnableFuture localRunnableFuture = newTaskFor(paramRunnable, paramT);
		execute(localRunnableFuture);
		return localRunnableFuture;
	}

	public  Future submit(Callable paramCallable) {
		if (paramCallable == null) {
			throw new NullPointerException();
		}
		RunnableFuture localRunnableFuture = newTaskFor(paramCallable);
		execute(localRunnableFuture);
		return localRunnableFuture;
	}

インタフェースExecutorServiceはExecutorを実現し、コードは以下の通りである.
package java.util.concurrent;

import java.util.Collection;
import java.util.List;

public abstract interface ExecutorService extends Executor {
	public abstract void shutdown();

	public abstract List shutdownNow();

	public abstract boolean isShutdown();

	public abstract boolean isTerminated();

	public abstract boolean awaitTermination(long paramLong, TimeUnit paramTimeUnit) throws InterruptedException;

	public abstract  Future submit(Callable paramCallable);

	public abstract  Future submit(Runnable paramRunnable, T paramT);

	public abstract Future> submit(Runnable paramRunnable);

	public abstract  List> invokeAll(Collection extends Callable> paramCollection)
			throws InterruptedException;

	public abstract  List> invokeAll(Collection extends Callable> paramCollection, long paramLong,
			TimeUnit paramTimeUnit) throws InterruptedException;

	public abstract  T invokeAny(Collection extends Callable> paramCollection)
			throws InterruptedException, ExecutionException;

	public abstract  T invokeAny(Collection extends Callable> paramCollection, long paramLong,
			TimeUnit paramTimeUnit) throws InterruptedException, ExecutionException, TimeoutException;
}

 インタフェースExecutorでは、次のように1つのメソッドしか定義されていません.
package java.util.concurrent;

public abstract interface Executor {
	public abstract void execute(Runnable paramRunnable);
}

 以上のように、S h e r a d PoolExecutor extends A b s t r actExecutorService implements ExecutorService extends Executor、
execute()メソッドは実際にはExecuterで宣言されたメソッドであり、ThreadPoolExecuterで具体的な実装が行われている.このメソッドはThreadPoolExecutorのコアメソッドであり、このメソッドによってスレッドプールにタスクをコミットし、スレッドプールに渡して実行することができる.
submit()メソッドは、ExecutorServiceで宣言されたメソッドであり、AbstractExecutorServiceではすでに具体的な実装が行われており、ThreadPoolExecutorでは書き換えられていない.このメソッドもスレッドプールにタスクをコミットするためのものであるが、execute()メソッドとは異なり、タスク実行の結果を返し、submit()メソッドの実装を見ることができる.実際に呼び出されたexecute()メソッドであることがわかりますが、Futureを使用してタスクの実行結果を取得します.
submit()メソッドでは、パラメータはCallableタイプでもRunnableタイプでも、execute()メソッドパラメータはRunnableタイプのみです.
 参照先:https://www.cnblogs.com/dolphin0520/p/3932921.html
参照先:https://www.jianshu.com/p/8e93a82197b1
参照先:https://blog.csdn.net/xiaojiahao_kevin/article/details/51735518