Javaでマルチスレッド!ExecutorServiceの調査内容をまとめる

Executorフレームワーク(Executor Framework)

java.util.concurrentクラスに入っている。

Executorフレームワークは、「処理の単位(タスク)」と「実行のシステム(Executorサービス)」を分ける。

Executorフレームワーク —- 「処理の単位(タスク)」
—- 「実行のシステム(Executorサービス)」

「処理の単位(タスク)」と「実行のシステム(Executorサービス)」に対してもポリシーを設定できる。

ワークキュー —- Thread —- Task
—- Task
—- Task
—- Task
—- Thread —- Task
—- Task
—- Task
—- Task
—- Thread —- Task
—- Task
—- Task
—- Task

ワークキューについて

java.util.concurrent
> Executorサービスを実施するためのフレームワーク(Executor Framework)

Executorサービスとはタスクを実行する汎用的な「実行のシステム」

ワークキューを作成する(ワークキューとは、処理をいれておくもの。)
ワークキューからのリクエストをシングルスレッドで処理する
> ExecutorService exec = Executors.newSingleThreadExecutor();

Runableを発行する
> exec.execute(runable);

Executorを終了する(??executorじゃなくてexecじゃないの?)
> executor.shutdown();

キューからのリクエストを処理するスレッドが2つ以上欲しいなら
> Executorサービスを実施するためのフレームワーク(Thread Pool)

> (ExecutorService exec =) Executors.newFixedThreadPool();

処理が軽いならキューを作らずにキャッシュ内でスレッド作成して処理する次を使う
> (ExecutorService exec =) Executors.newCashedThreadPool();

「処理の単位(タスク)」と「実行のシステム(Executorサービス)」を分ける。
> Executor Framework

「処理の単位(タスク)」と「実行のシステム(Executorサービス)」は同じ
> Thread処理

タスクについて

Executorサービスが実行する処理の単位はタスク(1.Runable 2.Callable)

Executor Frameworkの詳細は、java concurrency in practice に載っているとのこと。

ワーク・キュー容量

あるはずなのだが、ぐぐっても出てこない

ソースコードを追っていったら、ExecutorServiceはLinkedBlockingQueueを使用していて、
LinkedBlockingQueueに対しては、キューに溜まっているタスク数の確認や 容量の確認が出来るようだ。

LinkedBlockingQueue<E>
(公式サイト)https://docs.oracle.com/javase/jp/7/api/java/util/concurrent/LinkedBlockingQueue.html

RejectedExecutionException
設定Threadよりおおきく、かつワーク・キュー容量よりおおきくなると、タスク受付が拒否されてこのExceptionが投げられるらしい。

Timeoutの実装

Future<Integer> future = exec.submit(new TestCallable());

// timeoutだけ待つ。同期的に待つので次の処理は行われない。
// > 待っている間は、ブラウザのクルクルが出て操作不能状態になる。
int timeout = 100;
result = future.get(timeout, TimeUnit.SECONDS);

キャンセル処理を行ってInterruptedExceptionが出ていたのは、実行中のタスクに対してキャンセル処理を行ったからか
InterruptedException

Let's share SNS