ポイント
* java.lang.ThreadLocal を使う => スレッド毎の値を保持するためのクラス => 詳細は以下の関連記事を参照のこと。http://blogs.yahoo.co.jp/dk521123/36396466.html
サンプル
* スレッドごとのロガー(ThreadLocalを使って、スレッドごとにログを出力するサンプル)
Main.java
public class Main { public static void main(String[] args) { new ClientThread("Sample0001").start(); new ClientThread("Sample0002").start(); new ClientThread("Sample0003").start(); } }
ClientThread.java
public class ClientThread extends Thread { public ClientThread(String name) { super(name); } public void run() { System.out.println(getName() + " BEGIN"); for (int i = 0; i < 10; i++) { Log.println("i = " + i); try { Thread.sleep(100); } catch (InterruptedException e) { } } Log.close(); System.out.println(getName() + " END"); } }
ThreadLogger.java
import java.io.FileWriter; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; public class ThreadLogger { private SimpleDateFormat dateFormatter = null; private PrintWriter writer = null; public ThreadLogger(String fileName) { try { this.dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); this.writer = new PrintWriter(new FileWriter(fileName)); } catch (Exception ex) { ex.printStackTrace(); } } public void println(String value) { this.writer.println(this.dateFormatter.format(new Date()) + " : " + value); } public void close() { this.writer.println("=== Close ==="); this.writer.close(); } }
Logger.java
public class Logger { private static final ThreadLocal<ThreadLogger> logs = new ThreadLocal<ThreadLogger>(); public static void println(String value) { ThreadLogger log = Logger.getThreadLogger(); log.println(value); } public static void close() { ThreadLogger log = Logger.getThreadLogger(); log.close(); } private static ThreadLogger getThreadLogger() { ThreadLogger log = Logger.logs.get(); if (log == null) { log = new ThreadLogger(Thread.currentThread().getName() + ".log"); Logger.logs.set(log); } return log; } }
出力結果
コンソール画面
Sample0001 BEGIN Sample0002 BEGIN Sample0003 BEGIN Sample0001 END Sample0003 END Sample0002 END
Sample0001.log(Sample0002、3.log)
2014/12/14 03:39:36.131 : i = 0 2014/12/14 03:39:36.232 : i = 1 2014/12/14 03:39:36.332 : i = 2 2014/12/14 03:39:36.432 : i = 3 2014/12/14 03:39:36.532 : i = 4 2014/12/14 03:39:36.633 : i = 5 2014/12/14 03:39:36.734 : i = 6 2014/12/14 03:39:36.835 : i = 7 2014/12/14 03:39:36.935 : i = 8 2014/12/14 03:39:37.036 : i = 9 === Close ===
参考文献
http://www.hyuki.com/dp/dpinfo_ThreadSpecificStorage.htmlサンプル
http://pgcafe.moo.jp/JAVA/thread/main_10.htmhttp://blog.livedoor.jp/kosuke_pg/archives/51774038.html