java.util.concurrentパッケージを眺めてみる。
Cassandraのソースを読んだり、Androidの実装を試したりしているとどうしてもマルチスレッドのプログラミングがでてきます。
java.lang.Threadクラスや、java.lang.Runnableインターフェイスに関しては、その昔、トイプログラムで試したことはあります
がそんなに詳しくありませんでした。
JDK5で、java.util.concurrentパッケージができ、マルチスレッドプログラミングの実装の仕方が変わったようです。
そこで、Cassandraのソースを読んだり、Androidの実装をしていく上で、土台となるJAVAのマルチスレッドプログラミング
について眺めていこうと思います。
Executor インタフェース
JDK5のJavadocの引用です。
送信された Runnable タスクを実行するオブジェクト。このインタフェースは、 タスク送信を各タスクの実行方式 (スレッドの使用やスケジューリングの詳細などを含む) から分離する方法を提供します。 通常、Executor は、明示的にスレッドを作成する代わりに使用されます。 たとえば、各タスクセットごとに new Thread(new(RunnableTask())).start() を呼び出す代わりに、以下を使用できます。
説明を読んでも良くわかりませんでした。
どんなメソッドを実装する必要があるのか眺めてみます。
execute(Runnable command) 将来のある時点で指定されたコマンドを実行します。
Runnableを引数にとるexecuteメソッドだけのみみたいです。
executor.execute(new RunnableTask());
引数で渡すRunnableの実装が実行内容になります。
Executorの実装クラスでは、次のように実装することができます。
実装その1
public void execute(Runnable r) { r.run(); }
この場合は、そのまま同期実行になります。
実装その2
public void execute(Runnable r) { new Thread(r, "ThreadPerTaskExecutor").start(); }
別スレッドを生成し、そこにRunnableを渡すことにより、非同期実行を実現することができます。
java.util.concurrentパッケージには、その他にもいろいろクラスがあるので、順次使い方を
試していきたいとおもいます。