Thread를 사용하다보면 Local 변수는 상관없지만 다른 용도로 데이터의 저장이 필요할 때 Memeber변수를 사용하는 건 문제가 많을 수 있다. 그럴 때 사용하기 좋은 패턴이다.
여기서 핵심은 Log Class 이고 ThreadLocal을 사용한다는 점을 주목하자~!
public class TSLog {
private PrintWriter writer = null;
public TSLog (final String filename) {
try {
writer = new PrintWriter (new FileWriter(filename));
} catch (final IOException e) {
e.printStackTrace();
}
}
public void println(final String s) {
writer.println(s);
}
public void close () {
writer.println("====== End of log =====");
writer.close();
}
}
public class Log {
private static final ThreadLocal<TSLog> tsLogCollection = new ThreadLocal<TSLog>();
public static void println (final String s) {
getTSLog().println(s);
}
public static void close () {
getTSLog().close();
}
private static TSLog getTSLog() {
TSLog tsLog = tsLogCollection.get();
if (tsLog == null) {
tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt");
tsLogCollection.set(tsLog);
}//end if
return tsLog;
}
}
public class ClientThread extends Thread {
public ClientThread (final 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 (final InterruptedException e) {
}
}
Log.close();
System.out.println(getName() + " END");
}
}
public class Main {
public static void main (final String[] args) {
new ClientThread("AAAA").start();
new ClientThread("BBBB").start();
new ClientThread("CCCC").start();
}
}
'Development > Programming' 카테고리의 다른 글
[Scala] Mixin Class Composition (0) | 2015.02.06 |
---|---|
[Scala] Implicit Parameters (0) | 2015.02.03 |
[Java Design Patten] Two-Phase Termination 패턴 (0) | 2014.10.08 |
[Java Design Patten] Future 패턴 (2) | 2014.08.30 |
[Java Design Patten] Worker Thread 패턴 (0) | 2014.07.04 |