多线程教程002:线程范围内的共享变量

多线程课程002:线程范围内的共享变量
package cn.itcast.heima2;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;


//单一条线程,这条线程所产生的数据由在这条线程new出来的对象共享
//本题中,线程1产生的数据a,由A对象和B对象使用
//线程2产生的数据b,由A对象和B对象使用
public class ThreadScopeShareData {

//	private static int data = 0;
	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()
					+ " get data :" + data);
		}
	}

	static class B {
		public void get() {
			int data = threadData.get(Thread.currentThread());
			System.out.println("B from " + Thread.currentThread().getName()
					+ " get data :" + data);
		}
	}
}



输出结果:
Thread-0 has put data :806274789
Thread-1 has put data :1710804129
A from Thread-0 get data :806274789
A from Thread-1 get data :1710804129
B from Thread-0 get data :806274789
B from Thread-1 get data :1710804129


下面使用了ThreadLocal类,这个由API提供的类解决了共享变量的思路,其输出结果也如上。

public class ThreadLocalTest {

	private static ThreadLocal<Integer> x = new ThreadLocal<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);
							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()
					+ " get data: " + data );
		}
	}
	
	static class B{
		public void get(){
			int data = x.get();
			System.out.println("B from" + Thread.currentThread().getName()
					+ " get data: " + data );
		}
	}

}


这个需要学习里边的思想


package cn.itcast.heima2;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

//	往线程池x里边存入一个整形数据,然后由其他的线程池对象共享使用
//	新的线程存新的数据吗,由其他线程池对象共享使用
//	线程池对象的类的设计,单例的设计,拿到实例,set,拿到实例,get
public class ThreadLocalTest {

	private static ThreadLocal<Integer> x = 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);
					x.set(data);
/*					MyThreadScopeData myData = new MyThreadScopeData();
					myData.setName("name" + data);
					myData.setAge(data);
					myThreadScopeData.set(myData);*/
					MyThreadScopeData.getThreadInstance().setName("name" + data);
					MyThreadScopeData.getThreadInstance().setAge(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() 
					+ " get data :" + data);
/*			MyThreadScopeData myData = myThreadScopeData.get();;
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());*/
			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("A from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());
		}
	}
	
	static class B{
		public void get(){
			int data = x.get();			
			System.out.println("B from " + Thread.currentThread().getName() 
					+ " get data :" + data);
			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("B from " + Thread.currentThread().getName() 
					+ " getMyData: " + myData.getName() + "," +
					myData.getAge());			
		}		
	}
}

class MyThreadScopeData{
	private MyThreadScopeData(){}
	public static /*synchronized*/ MyThreadScopeData getThreadInstance(){
		MyThreadScopeData instance = map.get();
		if(instance == null){
			instance = new MyThreadScopeData();
			map.set(instance);
		}
		return instance;
	}
	//private static MyThreadScopeData instance = null;//new MyThreadScopeData();
	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-0 has put data :-1520297586
Thread-1 has put data :-1519143339
A from Thread-1 get data :-1519143339
A from Thread-0 get data :-1520297586
A from Thread-1 getMyData: name-1519143339,-1519143339
A from Thread-0 getMyData: name-1520297586,-1520297586
B from Thread-1 get data :-1519143339
B from Thread-0 get data :-1520297586
B from Thread-1 getMyData: name-1519143339,-1519143339
B from Thread-0 getMyData: name-1520297586,-1520297586