スレッドプールThreadPoolExecuterにおけるsubmitメソッドとexecuteメソッドの違いと関係
5363 ワード
ThreadPoolExecutorは、AbstractExecutorServiceを継承するスレッドプールです.次のコードがあります.
AbstraactExecutorServiceは、次のコードでExecutorServiceインタフェースを実装します.
インタフェースExecutorServiceはExecutorを実現し、コードは以下の通りである.
インタフェースExecutorでは、次のように1つのメソッドしか定義されていません.
以上のように、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
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