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
説明のわかりやすいサイト
絵が付いていてGood !!
https://java.keicode.com/lang/multithreading-executor.php
さらに、キャンセルの方法まで載っている。
https://java.keicode.com/lang/multithreading-cancel.php