多线程----线程范围内共享变量

线程范围内共享数据图解:

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

public class ThreadScopeShareDate {

	//三个模块共享数据,主线程模块和AB模块
	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();
					//Thread.currentThread()获取当前线程。
					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(){
			data=threadData.get(Thread.currentThread());
			System.out.println("A from"+Thread.currentThread().getName()+" get data:"+data);
		}
	}
	
	static class B{
		public void get(){
			data=threadData.get(Thread.currentThread());
			System.out.println("B from"+Thread.currentThread().getName()+" get data:"+data);
		}
	}
	
}

运行结果为:

Thread-0 has put data:836161760
Thread-1 has put data:-570080145
A fromThread-1 get data:-570080145
A fromThread-0 get data:-570080145
B fromThread-1 get data:836161760
B fromThread-0 get data:836161760

结果并没与实现线程间的数据同步,两个线程使用的是同一个线程的数据。要解决这个问题,可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据。代码实现:上面红色部分

程序中存在的问题:获取的数据与设置的数据不同步

             Thread-1共享数据设置为:-997057737

            Thread-1--A 模块数据:-997057737

            Thread-0共享数据设置为:11858818

            Thread-0--A 模块数据:11858818

            Thread-0--B 模块数据:-997057737

            Thread-1--B 模块数据:-997057737

最好将Runnable中设置数据的方法也写在对应的模块中,与获取数据模块互斥,以保证数据同步

猜你喜欢

转载自blog.csdn.net/pengzhisen123/article/details/80277879