線程內的數據共享
1需求:①線程1的A模塊和B模塊只能操作屬於線程1的相同數據
② 線程2的A模塊和B模塊只能操作屬於線程2的相同數據。
2、實現機制
①使用ThreadLocal實現線程內的數據共享,其實它內部就是一個Map
②通過一個Map<Thread,Object> 來存放與讀取對應Thread的數據Object
3、代碼
①Map方式:
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeShareData {
//將線程和其數據放入一個Map裏面存起來
private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();
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);
threadData.put(Thread.currentThread(), data);
new A().get();
new B().get();
}}).start();
}
}
static class A{
public void get(){
int data=threadData.get(Thread.currentThread());
System.out.println("A from"+Thread.currentThread().getName()+" has get data: "+data );
}
}
static class B{
public void get(){
int data=threadData.get(Thread.currentThread());
System.out.println("B from"+Thread.currentThread().getName()+" has get data: "+data );
}
}
}
②使用ThreadLocal類
import java.util.Random;
public class ThreadLocalTest {
//使用ThreadLocal實現線程內的數據共享,其實它內部就是一個Map
private static ThreadLocal<Integer> x=new ThreadLocal<Integer>();
public static void main(String[] args) {
for(int i=0;i<3;i++){
new Thread(new Runnable(){
@Override
public void run() {
int data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+" has put data: "+ data);
x.set(data);
new A().get();
new B().get();
}}).start();
}
}
static class A{
public void get(){
int data=x.get();
System.out.println("A from"+Thread.currentThread().getName()+" has get data: "+data );
}
}
static class B{
public void get(){
int data=x.get();
System.out.println("B from"+Thread.currentThread().getName()+" has get data: "+data );
}
}
}