class="java" name="code">public class ThreadTest6 { private static ThreadLocal<Integer> currentLocalThread = new ThreadLocal<Integer>(); private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread( new Runnable() { @Override public void run() { int data = new Random().nextInt(); System.out.println(Thread.currentThread().getName()+ " has put data : " + data); currentLocalThread.set(data); //获取与本线程相关的实例 MyThreadScopeData myData = MyThreadScopeData.getThreadInstance(); myData.setName("name" + data); myData.setAge(data); //存入当前线程中 myThreadScopeData.set(myData); new A().get(); new B().get(); } } ).start(); } } static class A{ public void get(){ //int data = localThreadMap.get(Thread.currentThread()); int data = currentLocalThread.get(); System.out.println("A from " + Thread.currentThread().getName() + " get data :" + data); //获取与本线程相关的实例 //MyThreadScopeData myData = MyThreadScopeData.getThreadInstance(); //从当前线程中获取 MyThreadScopeData myData = myThreadScopeData.get(); System.out.println("A from " + Thread.currentThread().getName() + " getName :" + myData.getName() + " , getAge : " + myData.getAge()); } } static class B{ public void get(){ //int data = localThreadMap.get(Thread.currentThread()); int data = currentLocalThread.get(); System.out.println("B from " + Thread.currentThread().getName() + " get data :" + data); //获取与本线程相关的实例 //MyThreadScopeData myData = MyThreadScopeData.getThreadInstance(); //从当前线程中获取 MyThreadScopeData myData = myThreadScopeData.get(); System.out.println("B from " + Thread.currentThread().getName() + " getName :" + myData.getName() + " , getAge : " + myData.getAge()); } } }
class MyThreadScopeData{ private MyThreadScopeData(){} /** * 单例 * @return */ public static /*synchronized*/ MyThreadScopeData getThreadInstance(){ MyThreadScopeData instance = map.get(); if (null == instance) { instance = new MyThreadScopeData(); map.set(instance); } return instance; } private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>(); private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
?
?
打印结果:
Thread-1 has put data : -1091157391
Thread-0 has put data : -1297198387
A from ?Thread-1 get data :-1091157391
A from ?Thread-1 getName :name-1091157391 , getAge : -1091157391
A from ?Thread-0 get data :-1297198387
A from ?Thread-0 getName :name-1297198387 , getAge : -1297198387
B from ?Thread-0 get data :-1297198387
B from ?Thread-0 getName :name-1297198387 , getAge : -1297198387
B from ?Thread-1 get data :-1091157391
B from ?Thread-1 getName :name-1091157391 , getAge : -1091157391
?