ThreadPoolExecutorクラス

java.util.concurrent.ThreadPoolExecutorは、通常はExecutorsファクトリメソッドを使用して構成された、場合によっては複数のプールされたスレッドの1つを使用して、送信された各タスクを実行するExecutorServiceです。また、現在のスレッドの統計をチェックして制御するためのさまざまなユーティリティメソッドも提供します。

ThreadPoolExecutorメソッド

シニア番号 方法と説明
1

protected void afterExecute(Runnable r, Throwable t)

指定されたRunnableの実行の完了時に呼び出されるメソッド。

2

void allowCoreThreadTimeOut(boolean value)

キープアライブ時間内にタスクが到着しない場合にコアスレッドがタイムアウトして終了し、新しいタスクが到着したときに必要に応じて置き換えられるかどうかを管理するポリシーを設定します。

3

boolean allowsCoreThreadTimeOut()

このプールでコアスレッドがタイムアウトし、keepAlive時間内にタスクが到着しない場合は終了し、必要に応じて新しいタスクが到着したときに置き換えられる場合はtrueを返します。

4

boolean awaitTermination(long timeout, TimeUnit unit)

シャットダウン要求後にすべてのタスクの実行が完了するか、タイムアウトが発生するか、現在のスレッドが中断されるまで、どちらか早い方でブロックします。

5

protected void beforeExecute(Thread t, Runnable r)

指定されたスレッドで指定されたRunnableを実行する前に呼び出されるメソッド。

6

void execute(Runnable command)

将来、指定されたタスクを実行します。

7

protected void finalize()

このエグゼキュータが参照されなくなり、スレッドがなくなると、シャットダウンが呼び出されます。

8

int getActiveCount()

タスクをアクティブに実行しているスレッドのおおよその数を返します。

9

long getCompletedTaskCount()

実行を完了したタスクのおおよその総数を返します。

10

int getCorePoolSize()

スレッドのコア数を返します。

11

long getKeepAliveTime(TimeUnit unit)

スレッドのキープアライブ時間を返します。これは、コアプールサイズを超えるスレッドが終了する前にアイドル状態を維持できる時間です。

12

int getLargestPoolSize()

プールに同時に存在したスレッドの最大数を返します。

13

int getMaximumPoolSize()

スレッドの最大許容数を返します。

14

int getPoolSize()

プール内の現在のスレッド数を返します。

15

BlockingQueue getQueue()

このエグゼキュータが使用するタスクキューを返します。

15

RejectedExecutionHandler getRejectedExecutionHandler()

実行不可能なタスクの現在のハンドラーを返します。

16

long getTaskCount()

これまでに実行がスケジュールされたタスクのおおよその総数を返します。

17

ThreadFactory getThreadFactory()

新しいスレッドの作成に使用されたスレッドファクトリを返します。

18

boolean isShutdown()

このエグゼキュータがシャットダウンされている場合はtrueを返します。

19

boolean isTerminated()

シャットダウン後にすべてのタスクが完了した場合はtrueを返します。

20

boolean isTerminating()

このエグゼキュータがshutdown()またはshutdownNow()の後で終了するプロセスにあるが、完全に終了していない場合はtrueを返します。

21

int prestartAllCoreThreads()

すべてのコアスレッドを開始し、アイドル状態で作業を待機させます。

22

boolean prestartCoreThread()

コアスレッドを開始し、アイドル状態で作業を待機させます。

23

void purge()

キャンセルされたすべての将来のタスクをワークキューから削除しようとします。

24

boolean remove(Runnable task)

このタスクが存在する場合は、エグゼキュータの内部キューから削除します。これにより、まだ開始されていない場合は実行されません。

25

void setCorePoolSize(int corePoolSize)

スレッドのコア数を設定します。

26

void setKeepAliveTime(long time, TimeUnit unit)

スレッドが終了する前にアイドル状態を維持できる時間制限を設定します。

27

void setMaximumPoolSize(int maximumPoolSize)

スレッドの最大許容数を設定します。

28

void setRejectedExecutionHandler(RejectedExecutionHandler handler)

実行不可能なタスクの新しいハンドラーを設定します。

29

void setThreadFactory(ThreadFactory threadFactory)

新しいスレッドの作成に使用されるスレッドファクトリを設定します。

30

void shutdown()

以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。

31

List<Runnable> shutdownNow()

アクティブに実行されているすべてのタスクを停止し、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。

32

protected void terminated()

エグゼキュータが終了したときに呼び出されるメソッド。

33

String toString()

このプールとその状態を識別する文字列を返します。これには、実行状態、推定されるワーカー数とタスク数が含まれます。

次のTestThreadプログラムは、スレッドベースの環境でのThreadPoolExecutorインターフェイスの使用法を示しています。

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TestThread {
	
   public static void main(final String[] arguments) throws InterruptedException {
      ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();

      //Stats before tasks execution
      System.out.println("Largest executions: "
         + executor.getLargestPoolSize());
      System.out.println("Maximum allowed threads: "
         + executor.getMaximumPoolSize());
      System.out.println("Current threads in pool: "
         + executor.getPoolSize());
      System.out.println("Currently executing threads: "
         + executor.getActiveCount());
      System.out.println("Total number of threads(ever scheduled): "
         + executor.getTaskCount());

      executor.submit(new Task());
      executor.submit(new Task());

      //Stats after tasks execution
      System.out.println("Core threads: " + executor.getCorePoolSize());
      System.out.println("Largest executions: "
         + executor.getLargestPoolSize());
      System.out.println("Maximum allowed threads: "
         + executor.getMaximumPoolSize());
      System.out.println("Current threads in pool: "
         + executor.getPoolSize());
      System.out.println("Currently executing threads: "
         + executor.getActiveCount());
      System.out.println("Total number of threads(ever scheduled): "
         + executor.getTaskCount());

      executor.shutdown();
   }  

   static class Task implements Runnable {

      public void run() {

         try {
            Long duration = (long) (Math.random() * 5);
            System.out.println("Running Task! Thread Name: " +
               Thread.currentThread().getName());
            TimeUnit.SECONDS.sleep(duration);
            System.out.println("Task Completed! Thread Name: " +
               Thread.currentThread().getName());
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
}

これにより、次の結果が得られます。

出力

Largest executions: 0
Maximum allowed threads: 2147483647
Current threads in pool: 0
Currently executing threads: 0
Total number of threads(ever scheduled): 0
Core threads: 0
Largest executions: 2
Maximum allowed threads: 2147483647
Current threads in pool: 2
Currently executing threads: 2
Total number of threads(ever scheduled): 2
Running Task! Thread Name: pool-1-thread-2
Running Task! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-1
Task Completed! Thread Name: pool-1-thread-2