ThreadLocal即线程局部变量。
功能:为每个使用该变量的线程,提供一个该变量的副本。
其实ThreadLocal中拥有一个Map,它是线程->变量的映射。
主要方法有三个,set,get,initValue。
set与get的作用不用多讲,主要是initValue,它默认返回的是null,子类可以通过重载该方法,来改变默认值。
1 public void set(T value) {
2 Thread t = Thread.currentThread();
3 ThreadLocalMap map = getMap(t);
4 if (map != null)
5 map.set(this, value);
6 else
7 createMap(t, value);
8 }
9
10
11 public T get() {
12 Thread t = Thread.currentThread();
13 ThreadLocalMap map = getMap(t);
14 if (map != null) {
15 ThreadLocalMap.Entry e = map.getEntry(this);
16 if (e != null)
17 return (T)e.value;
18 }
19 return setInitialValue();
20 }
21
22
23 protected T initialValue() {
24 return null;
25 }
3 ThreadLocalMap map = getMap(t);
4 if (map != null)
5 map.set(this, value);
6 else
7 createMap(t, value);
8 }
9
10
11 public T get() {
12 Thread t = Thread.currentThread();
13 ThreadLocalMap map = getMap(t);
14 if (map != null) {
15 ThreadLocalMap.Entry e = map.getEntry(this);
16 if (e != null)
17 return (T)e.value;
18 }
19 return setInitialValue();
20 }
21
22
23 protected T initialValue() {
24 return null;
25 }
使用示例:
1 package com.cody.test.thread;
2
3 public class ThreadLocalTest {
4
5 private static ThreadLocal<String> mThreadLocal = new ThreadLocal<String>();
6 private static Business business = new Business();
7 public static void main(String[] args) {
8 new Thread(new Runnable() {
9
10 @Override
11 public void run() {
12 business.sub();
13 }
14 }).start(); //开始一个线程
15
16 business.main();
17 }
18
19 public static class Business{
20
21 public void sub(){
22 for(int i = 0;i < 10;i ++){
23 mThreadLocal.set(String.valueOf(i));
24 try {
25 Thread.sleep(40);
26 } catch (InterruptedException e) {
27 e.printStackTrace();
28 }
29 System.out.println(Thread.currentThread().getName() + " : " + mThreadLocal.get());
30 }
31 }
32
33 public void main(){
34 for(int i = 0;i < 20;i ++){
35 mThreadLocal.set(String.valueOf(i));
36 try {
37 Thread.sleep(20);
38 } catch (InterruptedException e) {
39 e.printStackTrace();
40 }
41 System.out.println(Thread.currentThread().getName() + " : " + mThreadLocal.get());
42 }
43 }
44 }
45
2
3 public class ThreadLocalTest {
4
5 private static ThreadLocal<String> mThreadLocal = new ThreadLocal<String>();
6 private static Business business = new Business();
7 public static void main(String[] args) {
8 new Thread(new Runnable() {
9
10 @Override
11 public void run() {
12 business.sub();
13 }
14 }).start(); //开始一个线程
15
16 business.main();
17 }
18
19 public static class Business{
20
21 public void sub(){
22 for(int i = 0;i < 10;i ++){
23 mThreadLocal.set(String.valueOf(i));
24 try {
25 Thread.sleep(40);
26 } catch (InterruptedException e) {
27 e.printStackTrace();
28 }
29 System.out.println(Thread.currentThread().getName() + " : " + mThreadLocal.get());
30 }
31 }
32
33 public void main(){
34 for(int i = 0;i < 20;i ++){
35 mThreadLocal.set(String.valueOf(i));
36 try {
37 Thread.sleep(20);
38 } catch (InterruptedException e) {
39 e.printStackTrace();
40 }
41 System.out.println(Thread.currentThread().getName() + " : " + mThreadLocal.get());
42 }
43 }
44 }
45
46 }