有多年編程經驗的軟件行業藝術家們應該都知道ThreadLocal。ThreadLocal很多地方叫做線程本地變量,也有些地方叫做線程本地存儲。通俗的講ThreadLocal可以讓創建的變量只被同一個線程進行讀和寫操作。
所以盡管有兩個線程同時執行一段相同的代碼,而且這段代碼都指向同一個ThreadLocal變量的引用,但是這兩個線程依然不能看到彼此的ThreadLocal變量域。
~~~
ThreadLocal提供以下四個方法
public T get() { }//獲取當前線程存儲在ThreadLocal的值
public void set(T value) { }//設置當前線程往ThreadLocal存儲值
public void remove() { }//移除當前線程往ThreadLocal存儲值
protected T initialValue() { }//一個protected方法,一般是用來在使用時進行重寫的,它是一個延遲加載方法
~~~
接下來介紹怎樣使用ThreadLocal;
1.創建一個ThreadLocal對象。如以下代碼:
~~~
private ThreadLocal threadLocal = new ThreadLocal();
~~~
?
2.向ThreadLocal對象中設置當前線程變量值:
~~~
ThreadLocal.set("now Thread:"+Thread.currentThread().getName());
~~~
~~~
</pre></div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre"> </span>3.從ThreadLocal對象中獲取當前線程變量值;</div><div><span style="white-space:pre"> </span></div><div><span style="white-space:pre"> </span><pre name="code" class="java"> System.out.println(threadLocal.get());
~~~
3.完整的demo代碼:
~~~
package com.demo.test;
import java.util.Random;
public class MyThreadLocalTest {
public static final ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
public static void main(String[] args) {
new MyTread().start();
new MyTread().start();
new MyTread().start();
new MyTread().start();
}
}
class MyTread extends Thread implements Runnable {
@Override
public void run() {
int val = (int) (Math.random()*100);
System.out.println("now Thread:" + Thread.currentThread().getName()
+ ";val=" + val);
MyThreadLocalTest.threadLocal.set(val);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("now Thread:" + Thread.currentThread().getName()
+ ";val=" + MyThreadLocalTest.threadLocal.get());
}
}
~~~
4.結果
? ?
~~~
now Thread:Thread-1;val=24
now Thread:Thread-0;val=32
now Thread:Thread-2;val=41
now Thread:Thread-3;val=45
now Thread:Thread-1;val=24
now Thread:Thread-0;val=32
now Thread:Thread-2;val=41
now Thread:Thread-3;val=45
~~~