Java多線程學習:多個線程間共享數據

多個線程訪問共享對象和數據的方式有兩種狀況:
一、每一個線程執行的代碼相同,例如,賣票:多個窗口同時賣這100張票,這100張票須要多個線程共享。
二、每一個線程執行的代碼不一樣,例如:設計四個線程,其中兩個線程每次對j增長1,另外兩個線程每次對j減小1。java

a、若是每一個線程執行的代碼相同,能夠使用同一個Runnable對象,這個對象中有共享數據(靜態變量)。賣票就能夠這樣作,每一個窗口都在作賣票任務,賣的票都是同一個數據(點擊查看具體案例)。多線程

b、若是每一個線程執行的代碼不一樣,就須要使用不一樣的Runnable對象,有兩種方式實現Runnable對象之間的數據共享:
1)、將共享數據單獨封裝到一個對象中,同時在對象中提供操做這些共享數據的方法,能夠方便實現對共享數據各項操做的互斥和通訊。
二、)將各個Runnable對象做爲某個類的內部類,共享數據做爲外部類的成員變量,對共享數據的操做方法也在外部類中提供,以便實現互斥和通訊,內部類的Runnable對象調用外部類中操做共享數據的方法便可。ide

package com.ljq.test.thread;
  
/**
 * 多個線程之間共享數據的方式
 *
 * 設計四個線程,其中兩個線程每次對j增長1,另外兩個線程每次對j減小1。循環100次。
 *
 * @author Administrator
 *
 */
public class MultiThreadShareData {
  private static ShareData data1 = new ShareData();
  
  public static void main(String[] args) {
    ShareData data2 = new ShareData();
    new Thread(new DecrementRunnable(data2)).start();
    new Thread(new IncrementRunnable(data2)).start();
  
    final ShareData data1 = new ShareData();
    new Thread(new Runnable() {
      @Override
      public void run() {
        data1.decrement();
  
      }
    }).start();
    new Thread(new Runnable() {
      @Override
      public void run() {
        data1.increment();
  
      }
    }).start();
  
  }
  
}
  
/**
 * 建立線程類,負責對j減小1
 *
 * @author Administrator
 *
 */
class DecrementRunnable implements Runnable {
  private ShareData data;
  
  public DecrementRunnable(ShareData data) {
    this.data = data;
  }
  
  public void run() {
    for(int i=0; i<100; i++){
      data.decrement();
    }
      
  }
}
  
/**
 * 建立線程類,負責對j增長1
 *
 * @author Administrator
 *
 */
class IncrementRunnable implements Runnable {
  private ShareData data;
  
  public IncrementRunnable(ShareData data) {
    this.data = data;
  }
  
  public void run() {
    for(int i=0; i<100; i++){
      data.increment();
    }
      
  }
}
  
/**
 * 封裝共享數據
 *
 * @author Administrator
 *
 */
class ShareData {
  private int j = 0;
  
  /**
   * 每次對j增長1
   */
  public synchronized void increment() {
    j++;
    System.out.println("j++="+j);
  }
  
  /**
   * 每次對j減小1
   */
  public synchronized void decrement() {
    j--;
    System.out.println("j--="+j);
  }
    
    
}

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

 

推薦閱讀:url

  多線程間的數據共享和對象獨立,ThreadLocal詳解.net

  Java多線程共享數據、同步、通訊線程

  Java多線程鎖如何進行數據同步共享設計

相關文章
相關標籤/搜索