博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.java线程之ThreadLocal
阅读量:6279 次
发布时间:2019-06-22

本文共 1909 字,大约阅读时间需要 6 分钟。

ThreadLocal即线程本地化变量,使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但是大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。

下面的例子是实现日志记录的功能,每个线程都有对应的日志文件。

 

 1 
package com.thread.test;
 2 
 3 
import java.io.IOException;
 4 
import java.util.logging.FileHandler;
 5 
import java.util.logging.Level;
 6 
import java.util.logging.Logger;
 7 
 8 
public 
class ThreadLogger {
 9 
10     
private 
static 
final ThreadLocal<Logger> threadLocal = 
new ThreadLocal<Logger>();
11     
12     
public 
static 
void log(String msg){
13         getThreadLogger().log(Level.INFO,msg);
14     }
15     
16     
/**
17 
     * 从ThreadLocal中获取当前线程对应的Logger对象,如果ThreadLocal中没有保存当前线程对应的Logger对象
18 
     * 则新建一个Logger对象,并放入ThreadLocal中。
19 
     * 
@return
20 
     
*/
21     
public 
static Logger getThreadLogger(){
22         Logger logger = threadLocal.get();    
//
 获取当前线程的Logger对象
23 
        
if(logger == 
null){
24             logger = Logger.getLogger(Thread.currentThread().getName());
25             
try {
26                 logger.addHandler(
new FileHandler(Thread.currentThread().getName() + ".log"));
27             } 
catch (SecurityException e) {
28                 e.printStackTrace();
29             } 
catch (IOException e) {
30                 e.printStackTrace();
31             }
32             
33             threadLocal.set(logger);    
//
添加副本
34 
        }
35         
36         
return logger;
37     }
38 }

 

 

 

 

 1 
package com.thread.test;
 2 
 3 
public 
class Main {
 4 
 5     
 6     
public 
static 
void main(String[] args) {
 7         
/*
MyThread myThread = new MyThread();
 8 
        new Thread(myThread).start();
 9 
        new Thread(myThread).start();
*/
10         
11         
new TestThread("t1").start();
12         
new TestThread("t2").start();
13         
new TestThread("t3").start();
14     }
15 
16 }
17 
18 
class TestThread 
extends Thread{
19     
20     
public TestThread(String name) {
21         
super(name);
22     }
23     
24     @Override
25     
public 
void run() {
26         
for(
int i=1;i<5;i++){
27             ThreadLogger.log(getName()+":message"+i);
28         }
29     }
30 }

 

---------------------------------------------------- 誑逩の蝸犇 : I believe Nothing is impossible. ----------------------------------------------------

转载于:https://www.cnblogs.com/cody1988/archive/2011/10/17/2215116.html

你可能感兴趣的文章
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>