程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程編程之拜訪同享對象和數據的辦法

Java多線程編程之拜訪同享對象和數據的辦法

編輯:關於JAVA

Java多線程編程之拜訪同享對象和數據的辦法。本站提示廣大學習愛好者:(Java多線程編程之拜訪同享對象和數據的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程編程之拜訪同享對象和數據的辦法正文


多個線程拜訪同享對象和數據的方法有兩種情形:
1、每一個線程履行的代碼雷同,例如,賣票:多個窗口同時賣這100張票,這100張票須要多個線程同享。
2、每一個線程履行的代碼分歧,例如:設計四個線程,個中兩個線程每次對j增長1,別的兩個線程每次對j削減1。

a、假如每一個線程履行的代碼雷同,可使用統一個Runnable對象,這個對象中有同享數據。賣票便可以如許做,每一個窗口都在做賣票義務,賣的票都是統一個數據(點擊檢查詳細案例)。

b、假如每一個線程履行的代碼分歧,就須要應用分歧的Runnable對象,有兩種方法完成Runnable對象之間的數據同享:
1)、將同享數據零丁封裝到一個對象中,同時在對象中供給操作這些同享數據的辦法,可以便利完成對同享數據各項操作的互斥和通訊。
2、)將各個Runnable對象作為某個類的外部類,同享數據作為內部類的成員變量,對同享數據的操作辦法也在內部類中供給,以便完成互斥和通訊,外部類的Runnable對象挪用內部類中操作同享數據的辦法便可。

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);
  }
   
   
}

留意:要同步互斥的幾段代碼最好分離放在幾個自力的辦法中,這些辦法再放在統一個類中,如許比擬輕易完成它們之間的同步互斥和通訊。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved