|
|
51CTO旗下网站
|
|
移动端

1.7.9 ThreadLocal类

《Java多线程与Socket:实战微服务框架》第1章多线程基础,本书尽量采用简要和通俗易懂的方式来介绍多线程知识。本节为大家介绍ThreadLocal类。

作者:庞永华来源:电子工业出版社|2019-03-26 16:01

1.7.9 ThreadLocal类

ThreadLocal一般被称为线程本地变量或线程本地存储。其作用是为“当前线程”提供一个临时持有和传递对象的方法。由同一线程所执行的代码,只要持有同一个ThreadLocal对象的引用,就都能访问到与当前线程绑定的同一个数据对象。

ThreadLocal的内部声明了一个自定义的ThreadLocalMap。它以当前线程对象的引用为key,将希望保存和传递的数据对象存储在这个map中,以这样一种方式来为每一个线程分别保存一个值。

以上内容说起来比较抽象,用起来则非常简单,请自行测试并思考下面这个例子:

  1. public class C1_7_9 implements Runnable {  
  2. private static final Logger log = LoggerFactory.getLogger(C1_7_9.class);  
  3. protected static final ThreadLocal<String> threadLocal = new ThreadLocal<String>();  
  4. @Override  
  5. public void run() {  
  6. log.info("start = {}", threadLocal.get());  
  7. threadLocal.set(Thread.currentThread().getName());  
  8. try {  
  9. test();  
  10. } finally {  
  11. threadLocal.remove(); // 注释此句试试  
  12. }  
  13. }  
  14. public void test() {  
  15. log.info("test = {}", threadLocal.get());  
  16. }  
  17. public static void main(String[] args) {  
  18. // 注意,此处线程池的大小要小于提交的任务数,这样才看得出效果  
  19. ExecutorService es = Executors.newFixedThreadPool(5);  
  20. for (int i = 0; i < 20; i++) {  
  21. C1_7_9 c = new C1_7_9();  
  22. es.execute(c);  
  23. }  
  24. es.shutdown();  
  25. try {  
  26. es.awaitTermination(10L, TimeUnit.SECONDS);  
  27. } catch (InterruptedException e) {  
  28. e.printStackTrace();  
  29. }  
  30. }  


喜欢的朋友可以加入官方的读书群

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

Jenkins Pipeline可持续化集成

Jenkins Pipeline可持续化集成

优化运维流水线
共3章 | youerning

198人订阅学习

笑熬浆糊之职场那些事

笑熬浆糊之职场那些事

IT人的职场心法
共22章 | Bear_Boss

79人订阅学习

Redis运维秘籍

Redis运维秘籍

运维标配技术
共15章 | one叶孤舟

199人订阅学习

读 书 +更多

C++编程你也行

本书是一本优秀的C++教材,内容包括:基础类型、操作符和简单变量,循环和决策,命名空间和C++标准库,用C++编写函数,行为、序列点和求值...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客