WEB开发网
开发学院软件开发Java 多线程设计模式--Thread-specific Storage 阅读

多线程设计模式--Thread-specific Storage

 2009-09-17 00:00:00 来源:WEB开发网   
核心提示:日志操作类 Java代码publicclassTSLog{privatePrintWriterwriter=null;//初始化writer字段publicTSLog(Stringfilename){try{writer=newPrintWriter(newFileWriter("c:\\"+f

日志操作类

Java代码   

public class TSLog { 
  private PrintWriter writer = null; 
 
  //  初始化writer字段 
  public TSLog(String filename) { 
    try { 
      writer = new PrintWriter(new FileWriter("c:\\"+filename)); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
 
  //  加入一笔log 
  public void println(String s) { 
    writer.println(s); 
  } 
 
  // 关闭log 
  public void close() { 
    writer.println("==== End of log ===="); 
    writer.close(); 
  } 
}

多线程日志操作管理类

Java代码   

public class Log { 
  private static final ThreadLocal<TSLog> tsLogCollection = new ThreadLocal<TSLog>(); 
 
  // 加入一个log 
  public static void println(String s) { 
    getTSLog().println(s); 
  } 
 
  // 关闭log 
  public static void close() { 
    getTSLog().close(); 
  } 
 
  // 取得线程特有的log 
  private static TSLog getTSLog() { 
    //不同的线程获取自己线线程的TSLog 
    TSLog tsLog = tsLogCollection.get(); 
 
    //如果线程是第一次呼叫,就建立新挡案并登陆log 
    if (tsLog == null) { 
      tsLog = new TSLog(Thread.currentThread().getName() + "-log.txt"); 
      tsLogCollection.set(tsLog); 
    } 
 
    return tsLog; 
  } 
}

客户线程类

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"); 
  } 
}

测试类

Java代码   

public class Main { 
  public static void main(String[] args) { 
    new ClientThread("Alice").start(); 
    new ClientThread("Bobby").start(); 
    new ClientThread("Chris").start(); 
  } 
}

ThreadLocal 的定义

该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的私有静态字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。

例如,在下面的类中,私有静态 ThreadLocal 实例(serialNum)为调用该类的静态 SerialNum.get() 方法的每个线程维护了一个“序列号”,该方法将返回当前线程的序列号。(线程的序列号是在第一次调用 SerialNum.get() 时分配的,并在后续调用中不会更改。)

Java代码   

 public class SerialNum { 
   // The next serial number to be assigned 
   private static int nextSerialNum = 0; 
 
   private static ThreadLocal serialNum = new ThreadLocal() { 
     protected synchronized Object initialValue() { 
       return new Integer(nextSerialNum++); 
     } 
   }; 
 
   public static int get() { 
     return ((Integer) (serialNum.get())).intValue(); 
   } 
 }

每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。

Tags:线程 设计模式 Thread

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接