【Java】【非同期】 java.util.concurrent について

java.util.concurrent

http://docs.oracle.com/javase/jp/6/api/java/util/concurrent/package-summary.html
より
 * 並行プログラミングでよく使用されるユーティリティークラス

 * マルチスレッド・プログラミングで使用する
 * concurrent(コンカレント) = 同時発生する

Executorインタフェース

 * スレッドの再利用を可能にする

サンプル

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SampleExecutors {

  public static void main(String[] args) {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    System.out.println("★Begin★");
    for (int i = 0; i < 5; i++) {
      executor.execute(() -> {
        try {
          System.out.println("Starts : " + getCurrentTime());
          Thread.sleep(1000L);
          System.out.println("Done   : " + getCurrentTime());
        } catch (InterruptedException ex) {
          ex.printStackTrace();
        }
      });
    }
    System.out.println("★End★");
  }

  public static String getCurrentTime() {
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");
    return simpleDateFormat.format(calendar.getTime());
  }
}
出力結果
★Begin★
★End★
Starts : 2016/08/24 22:32:16 692
Done   : 2016/08/24 22:32:17 734
Starts : 2016/08/24 22:32:17 734
Done   : 2016/08/24 22:32:18 735
Starts : 2016/08/24 22:32:18 736
Done   : 2016/08/24 22:32:19 737
Starts : 2016/08/24 22:32:19 737
Done   : 2016/08/24 22:32:20 738
Starts : 2016/08/24 22:32:20 739
Done   : 2016/08/24 22:32:21 739

API仕様

http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/ExecutorService.html

参考文献

http://java.keicode.com/lang/multithreading-executor.php
http://d.hatena.ne.jp/j5ik2o/20110213/1297605350
http://www.02.246.ne.jp/~torutk/javahow2/concurrent.html

ExecutorServiceインタフェース

 * スレッドの再利用を可能にする
 * Executorインタフェースは、スーパーインタフェース

処理終了判定 : isShutdown() / isTerminated()

https://docs.oracle.com/javase/jp/6/api/java/util/concurrent/ExecutorService.html#isShutdown()
より
~~~~~~~~
* boolean isShutdown()
 この executor がシャットダウンしていた場合、true を返します

* boolean isTerminated()
 シャットダウンに続いてすべてのタスクが完了していた場合、true を返します。
shutdown または shutdownNow のいずれかが isTerminated の前に呼び出された場合を除き、
isTerminated が true になることはありません。
~~~~~~~~
何が違う?
shutdown または shutdownNow を呼び出しても、直ぐに終了するとは限らない。
「実行中⇒シャットダウン中⇒終了」って流れになる。
なので、isShutdown()がTrueになるのは「シャットダウン中」と「終了」が条件になるが
isTerminated()は「終了」のみが条件になる。

参考文献

http://docs.oracle.com/javase/jp/6/api/java/util/concurrent/ExecutorService.html
http://waman.hatenablog.com/entry/20120122/1327241289


関連記事

java.util.concurrent

java.util.concurrent について

http://blogs.yahoo.co.jp/dk521123/32538961.html

CountDownLatch ~カウントダウンラッチ~

http://blogs.yahoo.co.jp/dk521123/33538428.html

ExecutorServiceインタフェース / Runnableインタフェース

http://blogs.yahoo.co.jp/dk521123/33665815.html

ExecutorServiceインタフェース / Callableインタフェース

http://blogs.yahoo.co.jp/dk521123/34213161.html

ScheduledExecutorService ~スケジューラ~

http://blogs.yahoo.co.jp/dk521123/33934102.html

タイマー

TaskTimer

http://blogs.yahoo.co.jp/dk521123/33926465.html