1.线程范围内共享变量
通过将线程和数据以键值对形式保存到map集合中,取数据时,根据线程来取各自的数据,达到共享目的
2.ThreadLocal实现线程范围的共享变量
ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一线程中运行时要共享一份数据,而另外线程中运行时又共享另外一份数据。
每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录key是各自线程,value是各自的set传进去的值,各自线程get获取各自线程的值。
实现ThreadLocal变量的封装,让某个类针对不同线程分别创建一个独立的实例对象。
private MyThreadScopeData(){//使用单例设计模式,封装数据
}
publicstatic MyThreadScopeData getInstance(){
MyThreadScopeData instance =map.get();
if(instance==null){
instance=new MyThreadScopeData();
map.set(instance);
}
return instance;
}
privatestatic ThreadLocal<MyThreadScopeData>map = new ThreadLocal<MyThreadScopeData>();
MyThreadScopeData.getInstance().setName("name " + Thread.currentThread().getName());
MyThreadScopeData.getInstance().setAge(data);//添加数据
MyThreadScopeData myData =MyThreadScopeData.getInstance();
System.out.println("A from "+ myData.getName() +" get data:" + myData.getAge());//获取数据
3.多个线程访问共享对象和数据的方法
如果线程的执行代码相同,可以使用一个Runnable对象,这个Runnable对象中有那个共享数据。
如果线程的执行代码不同,则需要不同的Runnable对象,有两种方式实现Runnable对象之间的数据共享:
将共享数据封装到另一个对象中,然后将这个对象传递给哥哥Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对数据进行的各个操作的互斥和通信。
将Runnable对象做为某个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现同步和互斥,作为内部类的Runnable对象调用外部类的这些方法。
上面两种方式的组合:将共享数据封装在另外一个对象中, 每个线程对共享数据的操作方法也分配到那个对象身上。对象作为这个外部类的成员变量或者方法中的局部变量,每个Runnable对象作为外部类中的成员内部类或局部内部类。
总之,要不同步互斥的几段代码最好是分别放在几个独立的方法中,这些方法再放在同一个类中,这样比较容易实现它们之间的同步和互斥通信
---------------------- android培训、java培训、期待与您交流! ----------------------