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. 《WPF程序设计指南》读书笔记——第2章 基本画刷

    1.Color结构 using System; using System.Windows; using System.Windows.Input; using System.Windows.Media ...

  2. 1035 Password (20)

    #include <stdio.h> #include <string.h> struct MyStruct { ]; ]; bool changed; }; int main ...

  3. .vimrc & .bashrc 文件配置

    /* 如果vim还没有语法高亮,那么在/etc/profile 中添加以下语句 */ export TERM=xterm-color // 注: 只对各个用户自己的主目录下的.vimrc修改的话,修改 ...

  4. 如何查看windows操作系统当前使用的字符集

    如何查看windows操作系统当前使用的字符集 Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页.如果在没有参数的情况下使用,则 chcp 显示活动控制台代码页的数量. 语法 ch ...

  5. Hibernate从入门到精通(五)一对一单向关联映射

    上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...

  6. Telerik 控件事例(鼠标拖动行,拖动列,设置行对齐,行宽,是否显示)

    People.cs using System;using System.Collections.Generic;using System.Data;using System.Linq;using Sy ...

  7. 同一台Windows机器中启动多个Memcached服务

    同一台Windows机器中启动多个Memcached服务 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcached\memcached.exe ...

  8. State Management

    Samza的task可以把数据进行本地存储,并且对这些数据进行丰富的查询.   比较SQL中的select ... where...并不需要保存状态.但是aggregation和join就需要存储ro ...

  9. 从零开始运维之旅:如何监控你的 Windows?

    小弟乃刚刚踏入运维圈的资深小白一枚,正所谓完事开头难,公司里怕我把生产系统搞坏就让我先在测试环境上先练练手.巧的是测试环境又是我熟悉的 Windows 环境,心中窃喜啊.但问题随之而来,运维从何下手呢 ...

  10. rsync介绍

    老套的搬用一下rsync的介绍,rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync支持大多数的类Unix系统,无论是Linux.Sola ...