본문 바로가기

Development/Programming

[Java Design Patten] Thread Specific Storage 패턴

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();

}

}