Thread-Specific-Storage[线程保管箱]

一:Thread-Specific Storage的参与者
--->记录日志的线程(ClientThread)
--->负责获取不同线程记录日志(Log)
--->负责将日志写入文件的类(TsLog)

二:Thread-Specific Storage模式什么时候使用
--->当每个线程必须有自己的独有信息时,可以将该信息放入线程保管箱ThreadLocal

三:Thread-Specific Storage思考
--->放置线程特有信息的地方
        (1)线程外--->线程的保管箱ThreadLocal
           (2)    线程内-->线程体的局部变量

--->多线程处理共有数据,存在共享互斥
--->共享互斥会降低性能,所以要尽量将共享互斥的范围缩小
--->线程的性能在于线程代码的实现

四进阶说明        
--->

记录日志的行为类

 package com.yeepay.sxf.thread11;

 import java.io.FileWriter;
import java.io.PrintWriter; /**
* 日志类
* @author sxf
*
*/
public class TsLog {
//写日志对象
private PrintWriter printWriter=null; //构造器
public TsLog(String fileName){
try {
printWriter=new PrintWriter(new FileWriter(fileName));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //添加一条日志
public void addLogStr(String logstr){
printWriter.print(logstr);
} //关闭输出流
public void closeLog(){
printWriter.close();
}
}

代理不同线程的记录日志的对象

 package com.yeepay.sxf.thread11;

 /**
* 不同线程分发不同的日志实例
* @author sxf
*
*/
public class Log {
//线程的保管箱集合
private static final ThreadLocal tsLongConteint=new ThreadLocal(); public static void printLogStr(String logStr){
TsLog log=getTslog();
log.addLogStr(logStr);
}
//获取当前线程的保管箱
public static TsLog getTslog(){
//从线程保管箱中拿去当前线程的TsLog
TsLog lg=(TsLog) tsLongConteint.get();
//如果不存在,创建新的TsLog
if(lg==null){
lg=new TsLog("/usr/war/"+Thread.currentThread().getName()+"-log.txt");
tsLongConteint.set(lg);
}
return lg;
}
//关闭log对象的流
public static void closeTsLog(){
getTslog().closeLog();
}
}

记录日志的线程类

 package com.yeepay.sxf.thread11;
/**
* 记录日志的线程
* @author sxf
*
*/
public class ClientThreaad implements Runnable{ public ClientThreaad() { } @Override
public void run() {
for (int i = 0; i <10; i++) {
Log.printLogStr(Thread.currentThread().getName()+i);
System.out.println("ClientThreaad.run()==>"+Thread.currentThread().getName()+i);
}
Log.closeTsLog();
} }

测试类

 package com.yeepay.sxf.thread11;
/**
* 测试类
* @author sxf
*
*/
public class Test { public static void main(String[] args) {
//开启三个线程,产生3个文件,三个线程自己记录自己的日志
new Thread(new ClientThreaad()).start();
new Thread(new ClientThreaad()).start();
new Thread(new ClientThreaad()).start();
} }

多线程程序设计学习(12)Thread-soecific storage pattern的更多相关文章

  1. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  2. 多线程程序设计学习(10)Future pattern

    Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口) ...

  3. 多线程程序设计学习(11)Two-phapse-Termination pattern

    Two-phapse-Termination[A终止B线程] 一:Two-phapse-Termination的参与者--->A线程--->B线程 二:Two-phapse-Termina ...

  4. 多线程程序设计学习(9)worker pattern模式

    Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...

  5. 多线程程序设计学习(2)之single threaded execution pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  6. 多线程程序设计学习(7)read-write lock pattern

    Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...

  7. 多线程程序设计学习(13)Active Object pattern

    Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...

  8. 多线程程序设计学习(6)Producer-Consumer模式

    Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...

  9. 多线程程序设计学习(5)balking模式和timed模式

    Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...

随机推荐

  1. 1043. Is It a Binary Search Tree

    http://www.patest.cn/contests/pat-a-practise/1043 #include <stdio.h> #include <vector> u ...

  2. mysql 的 存储结构(储存引擎)

    1 MyISAM:这种引擎是mysql最早提供的.这种引擎又可以分为静态MyISAM.动态MyISAM 和压缩MyISAM三种:    静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的, ...

  3. RegisterClientScriptBlock CommandName 模块列 操作完成 提示

    this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Remind", "alert('获取成功!') ...

  4. CentOS安装配置Git服务器(gitosis)

    主要参考: http://blog.csdn.net/dengjianqiang2011/article/details/9260435 辅助参考: http://freeloda.blog.51ct ...

  5. Java中的IO流系统详解

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  6. 常见架构TLB miss处理方法(转)

    转自网站:http://blog.sina.com.cn/s/blog_633f462901018reb.html 0.       综述 总的来说TLB miss处理分为硬件处理和软件处理两种,硬件 ...

  7. [转载]C#缓存absoluteExpiration、slidingExpiration两个参数的疑惑

    看了很多资料终于搞明白cache中absoluteExpiration,slidingExpiration这两个参数的含义. absoluteExpiration:用于设置绝对过期时间,它表示只要时间 ...

  8. [转载]中国天气网API

    最近在做个网站要用到天气网的api,在网上找了些参考资料,这篇文章对天气网api的介绍比较详细,所以转载之,谢谢原作者的辛勤劳动和奉献精神. 原文地址:http://g.kehou.com/t1033 ...

  9. Android中SQLite应用详解(转)

    上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们对SQLite已经有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite. 现在的主流移动设备像Android.i ...

  10. 分析jQuery中的each方法

    在看jQuery源码是怎么实现each方法之前,我们看一下js的原生实现. ECMAScript 5为数组定义了一个forEach方法,该方法接受两个参数:第一个参数是要在每一个数组项上运行的函数,第 ...