多線程_線程範圍內數據共享


                   線程內的數據共享

   1需求①線程1A模塊和B模塊只能操作屬於線程1的相同數據

          ② 線程2A模塊和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	);
		}
	}
	
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章