Thread-Specific Storage Pattern 所有參予者 :
* Client (委託者) 參予者 :
* TSObjectProxy (線程獨有對象的代理者) 參予者 :
* TSObjectCollection (線程獨有對象的集合) :
* TSObject (線程獨有的對象) 參予者 :
* Thread-Specific Storage Pattern 類別圖 :
範例程序 :
接下來要寫的範例, 則是要將不同線程的輸出訊息寫到不同的log 文件裡.
* TSLog 類 :
在TSLog 類要對每個線程建立一個對應的物件. 提供個別 ClientThread 進行 log 動作, 代碼如下 :
- package dp.thread.ch11;
- import java.io.*;
- public class TSLog {
- private PrintWriter writer = null;
- public TSLog(String filename) {
- try{
- writer = new PrintWriter(new FileWriter(filename));
- }catch(IOException ioe) {
- ioe.printStackTrace();
- }
- }
- public void println(String s) {
- writer.println(s);
- }
- public void close(){
- writer.println("==== End of log ====");
- writer.close();
- }
- }
他是提供 ClientThread 進行 log 動作的統一接口, 而之後的log 會 delegate 給 TSLog 進行操作, 代碼如下 :
- package dp.thread.ch11;
- public class Log {
- private static final ThreadLocal tsLogCollection = new ThreadLocal();
- public static void println(String s){
- getTSLog().println(s);
- }
- public static void close(){
- getTSLog().close();
- }
- private static TSLog getTSLog(){
- TSLog tsLog = (TSLog)tsLogCollection.get();
- if(tsLog == null) {
- tsLog = new TSLog(Thread.currentThread().getName()+"-log.txt");
- tsLogCollection.set(tsLog);
- }
- return tsLog;
- }
- }
ClientThread 是使用 Log 類進行log動作的線程. 代碼如下 :
- package dp.thread.ch11;
- 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 ioe) {
- ioe.printStackTrace();
- }
- }
- Log.close();
- System.out.println(getName()+" END");
- }
- }
為模擬使用 Thread-Specific Storage Pattern 的 Entry point. 會建立 3個ThreadClient 物件同時使用 Log類別進行 log動作. 代碼如下 :
- package dp.thread.ch11;
- public class Main {
- public static void main(String args[]) {
- new ClientThread("John").start();
- new ClientThread("Peter").start();
- new ClientThread("Bob").start();
- }
- }
執行結果 :
會依序建立 John-log.txt, Peter-log.txt 與 Bob-log.txt 檔案並記載如下內容 :
補充說明 :
@ 不必擔心被其他線程訪問 :
@. 局部變量與 java.lang.ThreadLocal 類 :
沒有留言:
張貼留言