黑马程序员--线程及共享变量

来源:互联网 发布:申请域名需要多少钱 编辑:程序博客网 时间:2024/05/17 23:42
---------------------- android培训、java培训、期待与您交流! ----------------------

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培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击