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. 统计网卡TX(发送)RX(接受)流量脚本

    显示网卡流量的方法蛮多,一般我们可以通过dstat来查看,但dstat不一定所有的机器都有安装.而我们知道,通过ifconfig可以看到某一网卡发送与接收的字节数,所以我们可以写一个脚本来统计一下. ...

  2. java 构造函数

    1.public className(){}. 2.名称与类名相同,无返回值,无返回类型,void也不行.(就是上边的形式,除了可以有参数). 3.有0个或多个参数. 4.每个类都至少有一个const ...

  3. Spring execution 表达式

    execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) th ...

  4. 【BZOJ 1079】[SCOI2008]着色方案

    Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...

  5. s3c2440之cache

    cache高速缓冲存储器注意与块设备页高速缓存进行区别,一个是硬件的实现一个是软件的实现,块设备页高速缓存. s3c2440/s3c2410里面主要有一个arm920t的核,但同时包含几个协处理器,协 ...

  6. 第一个js库文件

    <!DOCTYPE html> <html xmlns=;         ;                     }                 };     })(); ...

  7. 使用eclipse生成文档(javadoc)

    使用eclipse生成文档(javadoc)主要有三种方法:1,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步.在Java ...

  8. Spark中shuffle的触发和调度

    Spark中的shuffle是在干嘛? Shuffle在Spark中即是把父RDD中的KV对按照Key重新分区,从而得到一个新的RDD.也就是说原本同属于父RDD同一个分区的数据需要进入到子RDD的不 ...

  9. Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details. ShareSDK 也有这种错误

    Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for ...

  10. grep正则表达式后面的单引号和双引号的区别

    单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换:双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容! 一般常量用单引号' ...