public class PIAXThreadPool extends ThreadPoolExecutor
通常の利用では、スレッドプールで起動するスレッドの最大数と、スレッド名のprefix部分を指定するだけでよい。 スレッドプールをshutdownする際にも、shutdownメソッドを呼ぶだけで済むようになっている。 executeメソッドについては、通常のメソッドの他、引数にPeerIdを指定するメソッドを用意している。 このexecuteメソッドは、スレッド名に指定されたPeerIdを付与する。 これにより、log出力の際に、どのPeerで動いたスレッドかを識別できる。
PIAXThreadPoolでは、ThreadPoolExecutorの引数として指定するtaskのキューイングに、 SynchronousQueueを使っている。これは実質的にキューイングをしないですぐにtaskをスレッド実行することを 意味している。また、拒否されたtaskに対しての振る舞いはデフォルトのAbortPolicy() にしている。 この2つの設定(SynchronousQueue+AbortPolicy()) により、スレッドプールが最大のスレッド数に達した 時点で、新規のtaskは、拒否される。
このようにすることで、スレッドプールの動きを簡潔にし、予期せぬデッドロックを防ぐことができる。 デッドロックは、次のような場合に起こる。
一連のtask群Tの後にあるtask xが動くような状況で、Tのいくつかのtaskがxの発生により、ロック状態に入り、 xが起動または終了することでロック解除されるとする。この場合、スレッドプールは次第に飽和状態になり、 新しいtaskはキューに乗ったままになる。結果デッドロックが起こる。 例えば、互いに相手を呼び合うRPCが再帰的に何段も重なったとすると、末端のRPCがreturnするまで、 他のRPC呼び出しはブロックする。この状態で、末端のすぐにreturnするRPC呼び出しがキューにのってしまうと、 全体がデッドロックしてしまう。
ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy| 修飾子とタイプ | フィールドと説明 |
|---|---|
static int |
CORE_POOL_SIZE
thread pool内に常時起動しているスレッドの数
|
static int |
MAX_POOL_SIZE
thread pool内に起動可能なスレッドの最大数
|
static long |
MAX_WAIT_TIME_FOR_TERMINATION
thread poolの終了時にアクティブなスレッドの終了を待機する最長時間
|
static long |
THREAD_KEEP_ALIVE_TIME
アイドル状態のスレッドが終了前に新規タスクを待機する最長時間。
|
static String |
THREAD_NAME_PREFIX
スレッド名のprefix部分。
|
| コンストラクタと説明 |
|---|
PIAXThreadPool()
PIAXThreadPoolをデフォルト設定を使って、生成する。
|
PIAXThreadPool(int corePoolSize,
int maxPoolSize,
long keepAliveTime,
String threadNamePrefix,
int threadPriority)
PIAXThreadPoolを引数の設定に従い、生成する。
|
PIAXThreadPool(int maxPoolSize,
String threadNamePrefix)
PIAXThreadPoolを最大スレッド数と、スレッド名のprefixを指定し、生成する。
|
| 修飾子とタイプ | メソッドと説明 |
|---|---|
void |
execute(PeerId peerId,
Runnable task)
taskをスレッドプールのスレッドを使って実行する。
|
void |
execute(Runnable task)
taskをスレッドプールのスレッドを使って実行する。
|
void |
shutdown()
PIAXThreadPoolをshutdownする。
|
afterExecute, allowCoreThreadTimeOut, allowsCoreThreadTimeOut, awaitTermination, beforeExecute, finalize, getActiveCount, getCompletedTaskCount, getCorePoolSize, getKeepAliveTime, getLargestPoolSize, getMaximumPoolSize, getPoolSize, getQueue, getRejectedExecutionHandler, getTaskCount, getThreadFactory, isShutdown, isTerminated, isTerminating, prestartAllCoreThreads, prestartCoreThread, purge, remove, setCorePoolSize, setKeepAliveTime, setMaximumPoolSize, setRejectedExecutionHandler, setThreadFactory, shutdownNow, terminated, toStringinvokeAll, invokeAll, invokeAny, invokeAny, newTaskFor, newTaskFor, submit, submit, submitpublic static int CORE_POOL_SIZE
public static int MAX_POOL_SIZE
public static long THREAD_KEEP_ALIVE_TIME
public static String THREAD_NAME_PREFIX
public static final long MAX_WAIT_TIME_FOR_TERMINATION
public PIAXThreadPool()
public PIAXThreadPool(int maxPoolSize,
String threadNamePrefix)
maxPoolSize - 最大スレッド数threadNamePrefix - スレッド名のprefixpublic PIAXThreadPool(int corePoolSize,
int maxPoolSize,
long keepAliveTime,
String threadNamePrefix,
int threadPriority)
corePoolSize - 最小スレッド数maxPoolSize - 最大スレッド数keepAliveTime - アイドルスレッドが停止するまでの最長待ち時間threadNamePrefix - スレッド名のprefixthreadPriority - スレッドの優先度(1から10の数字)public void execute(PeerId peerId, Runnable task) throws RejectedExecutionException
すでに、実行スレッド数が最大数に達した場合は、RejectedExecutionExceptionが発行される。 このメソッドを使って実行されたスレッドの名前にはpeerIdが付与される。
peerId - スレッド名に付与するPeerIdtask - 実行するRunnableオブジェクトRejectedExecutionException - 実行スレッド数が最大数に達した場合public void execute(Runnable task) throws RejectedExecutionException
すでに、実行スレッド数が最大数に達した場合は、RejectedExecutionExceptionが発行される。 このメソッドを使った場合、実行されたスレッド名にはpeerIdは付与されない。
execute インタフェース内 Executorexecute クラス内 ThreadPoolExecutortask - 実行するRunnableオブジェクトRejectedExecutionException - 実行スレッド数が最大数に達した場合public void shutdown()
この待ち時間は、MAX_WAIT_TIME_FOR_TERMINATIONの値を変えることで変更できる。 通常はデフォルト値のままでよい。、
shutdown インタフェース内 ExecutorServiceshutdown クラス内 ThreadPoolExecutorCopyright © 2017. All rights reserved.