线程范围内共享数据图解:
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中设置数据的方法也写在对应的模块中,与获取数据模块互斥,以保证数据同步