多線程(四) 實現線程範圍內模塊之間共享數據及線程間數據獨立(Map集合)

 多個線程訪問共享對象和數據的方式

       1.如果每個線程執行的代碼相同,可以使用同一個Runnable對象,這個Runnable對象中有那個共享數據,例如,買票系統就可以這麼做。

       2.如果每個線程執行的代碼不同,這時候需要用不同的Runnable對象,有如下兩種方式來實現這些Runnable對象之間的數據共享:
            將共享數據封裝在另外一個對象中,然後將這個對象逐一傳遞給各個Runnable對象。每個線程對共享數據的操作方法也分配到那個對象身上去完成,這樣容易實現針對該數據進行的各個操作的互斥和通信。
            將這些Runnable對象作爲某一個類中的內部類,共享數據作爲這個外部類中的成員變量,每個線程對共享數據的操作方法也分配給外部類,以便實現對共享數據進行的各個操作的互斥和通信,作爲內部類的各個Runnable對象調用外部類的這些方法。
            上面兩種方式的組合:將共享數據封裝在另外一個對象中,每個線程對共享數據的操作方法也分配到那個對象身上去完成,對象作爲這個外部類中的成員變量或方法中的局部變量,每個線程的Runnable對象作爲外部類中的成員內部類或局部內部類。

            總之,要同步互斥的幾段代碼最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現它們之間的同步互斥和通信。


     3.極端且簡單的方式,即在任意一個類中定義一個static的變量,這將被所有線程共享(慎用)。


package cn.itcast.lishehe;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
/** 李社河-2015年6月12日
 * 題目要求:構造兩線程,要求: 
 *    (1)兩線程併發操作  (這就要求不能使用syschronized關鍵字) 
 *    (2)要求兩線程分別訪問各自的數據data,互不干擾(可以使用Map集合,以Thread.currentThread()作爲key,以data作爲value) 
 *    (3)線程內有A、B兩個模塊,模塊之間共享數據data  
 **/
public class Thread2ThreadDataIndependent {  
     static Map<Thread,Integer> threadMap = 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(); //這裏的data必須定義爲局部變量,否則線程間不能實現數據獨立  
                    System.out.println(Thread.currentThread().getName()+" has put data: "+data);  
                    threadMap.put(Thread.currentThread(), data);  
                    new A().get();  
                    new B().get();  
                }  
            }).start();  
        }  
    }  
      
    static class A{  
        public void get(){  
            int data = threadMap.get(Thread.currentThread());  
            System.out.println("A from "+Thread.currentThread().getName()+" get data :"+data);  
        }  
    }  
    static class B{  
        public void get(){  
            int data = threadMap.get(Thread.currentThread());  
            System.out.println("B from "+Thread.currentThread().getName()+" get data :"+data);  
        }  
    }  
}  

運行結果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章