倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Groovy で Thread-Specific Storage パターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』に載っているデザインパターンを Groovy/GPars で書こうシリーズ、今回は Thread-Specific Storage パターン。 このパターンは java.lang.ThreadLocal を使えば実装できます。 あんまり Groovy/GPars の出番が感じられないので流す感じで。

サンプル・コード


作成するソースは

  • ThreadSpecificLog クラス スレッド毎にインスタンス作成されるクラス
  • Log クラス
  • 実行スクリプト

です。

ThreadSpecificLog クラス

class ThreadSpecificLog {
    
    private PrintWriter writer = null

    ThreadSpecificLog(String filename){
        this.writer = new PrintWriter(new FileWriter(filename))
    }
    
    void println(String s){
        this.writer.println(s)
    }
    
    void close(){
        this.writer.println('==== End of log ====')
        this.writer.close()
    }
}

Log クラス

class Log {
    
    private static final ThreadLocal<ThreadSpecificLog> TS_LOGS = new ThreadLocal<>()
    
    static void println(String s){
        getTSLog().println(s)
    }
    
    static void close(){
        getTSLog().close()
    }
    
    private static ThreadSpecificLog getTSLog(){
        def log = TS_LOGS.get()
        
        if (log == null){
            log = new ThreadSpecificLog("${Thread.currentThread().name}-log.txt")
            TS_LOGS.set(log)
        }

        return log
    }
}

実行スクリプト

Thread.start client('Alice')
Thread.start client('Bobby')
Thread.start client('Chris')

def client(String name){
    return {
        println "$name BEGIN"
        10.times{ Log.println("i = $it"); Thread.sleep 100 }
        Log.close()
        println "$name END"
    }
}

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編


プログラミングGROOVY

プログラミングGROOVY