『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Two-Phase Termination パターン。 このパターンでは、スレッドを終了したいときにいきなり止めるのではなく、後片付けをしましょう、ってパターンです。 ここでは、このパターンと言えるのかどうか分かりませんが、Actor のライフサイクルを利用して後片付けを行うサンプルを見ていきます。
Actor の作成方法は、Actor のサブクラスを作成する方法と Actors#actor メソッドを使用して作成する方法がありましたが、後者の方法で Actor のライフサイクルを利用する方法が分からなかったので*1、ここでは Actor のサブクラスを作成する方法だけで試しています。
サンプル・コード
このサンプルで作成するコードは
- CountupActor クラス Actor のライフサイクルを利用して後処理を行う
- 実行スクリプト
です。 Actor の後処理と言っても、ここでは文字列を表示するだけですが。
CountupActor クラス
Actor のライフサイクルに割り込ませることができるフックとなるメソッドは
- afterStart
- afterStop
- onInterrupt
- onTimeout
- onException
があります。 ここでのサンプルではこれらのメソッド5つを実装していますが、後の実行スクリプトを実行して呼ばれるのは afterStart, afterStop, onInterrupt の3つです:
import groovyx.gpars.actor.DefaultActor class CountupActor extends DefaultActor{ private long counter = 0 @Override protected void act() { loop{ this.counter++ println "count up: counter = $counter" Thread.sleep 500 } } private void afterStart() { println "CountupActor has started" } private void afterStop(List undeliveredMessages) { println "CountupActor has stopped" } private void onInterrupt(InterruptedException e) { println "CountupActor has been interrupted" } // 下記の実行スクリプトでは使われない private void onTimeout() { println "CountupActor has timed out" } // 下記の実行スクリプトでは使われない private void onException(Exception e) { println "CountupActor threw an exception" } }
実行スクリプト
実行スクリプトでは、上記の CountupActor を生成&開始した後、10000 msec 待って、Actor に対して terminate() メソッドを呼び出してます。 これを呼び出すことによって、 afterStop → onInterrupt の順で呼び出されます:
println 'main: BEGIN' try{ def actor = new CountupActor().start() Thread.sleep 10000 println 'main: Termination Request' actor.terminate() println 'main: Join' actor.join() }catch(InterruptedException ex){ ex.printStackTrace() } println 'main: END'
ちなみに、Actor には terminate() メソッドの他に stop() メソッドってのもありますが、どう違うんでしょう・・・? 実行してみれば確かに挙動は違いますが。
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/03/21
- メディア: 大型本
- 購入: 15人 クリック: 287回
- この商品を含むブログ (199件) を見る
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (152件) を見る