簡介
讓每個線程都擁有自己的專屬本地變量
示例
package thread;
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable{
private static final ThreadLocal<SimpleDateFormat> formatter = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd HHmm"));
@Override
public void run() {
System.out.println("Thread Name:" + Thread.currentThread().getName() + ", default Formatter:" + formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
formatter.set(new SimpleDateFormat("yy MM dd"));
System.out.println("Thread Name:" + Thread.currentThread().getName() + ", default Formatter:" + formatter.get().toPattern());
}
public static void main(String[] args) {
ThreadLocalExample threadLocalExample = new ThreadLocalExample();
for (int i = 0; i < 10; ++i) {
Thread thread = new Thread(threadLocalExample, "" + i);
try {
int tmp = new Random().nextInt(1000);
Thread.sleep(tmp);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.start();
}
}
}
運作
Thread Name:0, default Formatter:yyyyMMdd HHmm
Thread Name:1, default Formatter:yyyyMMdd HHmm
Thread Name:2, default Formatter:yyyyMMdd HHmm
Thread Name:1, default Formatter:yy MM dd
Thread Name:2, default Formatter:yy MM dd
Thread Name:3, default Formatter:yyyyMMdd HHmm
Thread Name:0, default Formatter:yy MM dd
Thread Name:3, default Formatter:yy MM dd
Thread Name:4, default Formatter:yyyyMMdd HHmm
Thread Name:5, default Formatter:yyyyMMdd HHmm
Thread Name:4, default Formatter:yy MM dd
Thread Name:5, default Formatter:yy MM dd
Thread Name:6, default Formatter:yyyyMMdd HHmm
Thread Name:6, default Formatter:yy MM dd
Thread Name:7, default Formatter:yyyyMMdd HHmm
Thread Name:8, default Formatter:yyyyMMdd HHmm
Thread Name:7, default Formatter:yy MM dd
Thread Name:8, default Formatter:yy MM dd
Thread Name:9, default Formatter:yyyyMMdd HHmm
Thread Name:9, default Formatter:yy MM dd
分析
從結果看雖然其他的線程已經改變了formatter變量,但是運作本線程時還是原始的值。