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

简介: Thread-Specific-Storage[线程保管箱]一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不同线程记录日志(Log)--->负责将日志写入文件的类(TsLog)       二:Thread-Specifi...

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

 

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
353 10
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
1278 6
【Java学习】多线程&JUC万字超详解
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
606 0
|
监控 Java API
Java 程序设计 第八章 线程
Java 程序设计 第八章 线程
133 1
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
157 0
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
879 0
|
Java
Java线程学习经典例子-读写者演示
Java线程学习经典例子-读写者演示
110 0
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信
|
11月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
470 83
|
8月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
311 6

热门文章

最新文章