多线程程序设计学习(12)Thread-soecific storage pattern

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

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

       

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

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

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

四进阶说明        
--->

记录日志的行为类

 1 package com.yeepay.sxf.thread11;
 2
 3 import java.io.FileWriter;
 4 import java.io.PrintWriter;
 5
 6 /**
 7  * 日志类
 8  * @author sxf
 9  *
10  */
11 public class TsLog {
12     //写日志对象
13     private PrintWriter printWriter=null;
14
15     //构造器
16     public TsLog(String fileName){
17         try {
18             printWriter=new PrintWriter(new FileWriter(fileName));
19         } catch (Exception e) {
20             // TODO Auto-generated catch block
21             e.printStackTrace();
22         }
23     }
24
25     //添加一条日志
26     public void addLogStr(String logstr){
27         printWriter.print(logstr);
28     }
29
30     //关闭输出流
31     public void closeLog(){
32         printWriter.close();
33     }
34 }

View Code

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

 1 package com.yeepay.sxf.thread11;
 2
 3
 4 /**
 5  * 不同线程分发不同的日志实例
 6  * @author sxf
 7  *
 8  */
 9 public class Log {
10     //线程的保管箱集合
11     private static final ThreadLocal tsLongConteint=new ThreadLocal();
12
13     public static void printLogStr(String logStr){
14         TsLog log=getTslog();
15         log.addLogStr(logStr);
16     }
17     //获取当前线程的保管箱
18     public static TsLog getTslog(){
19         //从线程保管箱中拿去当前线程的TsLog
20         TsLog lg=(TsLog) tsLongConteint.get();
21         //如果不存在,创建新的TsLog
22         if(lg==null){
23             lg=new TsLog("/usr/war/"+Thread.currentThread().getName()+"-log.txt");
24             tsLongConteint.set(lg);
25         }
26         return lg;
27     }
28     //关闭log对象的流
29     public static void  closeTsLog(){
30         getTslog().closeLog();
31     }
32 }

View Code

记录日志的线程类

 1 package com.yeepay.sxf.thread11;
 2 /**
 3  * 记录日志的线程
 4  * @author sxf
 5  *
 6  */
 7 public class ClientThreaad  implements Runnable{
 8
 9     public ClientThreaad() {
10
11     }
12
13
14     @Override
15     public void run() {
16         for (int i = 0; i <10; i++) {
17             Log.printLogStr(Thread.currentThread().getName()+i);
18             System.out.println("ClientThreaad.run()==>"+Thread.currentThread().getName()+i);
19         }
20         Log.closeTsLog();
21     }
22
23
24 }

View Code

测试类

 1 package com.yeepay.sxf.thread11;
 2 /**
 3  * 测试类
 4  * @author sxf
 5  *
 6  */
 7 public class Test {
 8
 9
10     public static void main(String[] args) {
11         //开启三个线程,产生3个文件,三个线程自己记录自己的日志
12         new Thread(new ClientThreaad()).start();
13         new Thread(new ClientThreaad()).start();
14         new Thread(new ClientThreaad()).start();
15     }
16
17 }

View Code

 

时间: 2024-09-25 07:40:52

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

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

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状

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

Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口)--->Future(蛋糕票据)--->ReaData(制作蛋糕过程)        二:Future pattern模式什么时候使用---> 三:Future pattern思考       ---> 四进阶说明        ---> 数据类接口 1 package com.

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

Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Request(工作内容的包装)--->Worker(工人线程)        二:Worker pattern模式什么时候使用--->类似生产者消费者 三:Worker pattern思考 四进阶说明--->工作线程取出请求内容包装后,根据多态,不同的请求执行不同的业务方法   Request接

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

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

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

Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线程         二Read-Write Lock Pattern模式什么时候使用---> * 为了多线线程环境下保护数据安全,我们必须避免的冲突 * 一个线程读取,另一个线程写入的read-write conflick * 一个线程写入,另一个线程写入的write-write conflick *

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

Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)--->主动对象接口(工人和工头)--->生产端线程(加工产品的线程)--->存放生产请求的队列(存放请求的队列)--->请求实例化(将方法的启动和执行分离的实例化包含)--->订单--->产品--->订单产品的共同接口        二:Active Object模式

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

Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程(制造蛋糕的线程)--->消费者线程(吃掉蛋糕的线程)         二:Producer-Consumer pattern模式什么时候使用--->大量生产+大量消费的模式 三:Producer-Consumer pattern思考--->[生产消费者模式],肩负保护数据安全性使命的是通道

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

Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程,当警戒条件达到执行具体操作的线程,参与者(被警戒的参与者)        二:balking pattern模式什么时候使用--->不需要刻意去执行什么操作的时候(比如说自动保存)--->不想等待警戒条件成立时.(不让线程休息)--->警戒条件只有第一次成立时候.    三:balking

多线程程序设计学习(4)guarded suspension模式

Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该参与者拥有一个被防卫的方法(getRequest),如果警戒条件达成,则执行.警戒条件不达成,则线程进入wait set                1.2该参与者还拥有一个改变参与者状态的方法(putRequest).参与者的状态影响着警戒条件的是否达成. --->该模式的角色:生产端线程,消费端线