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

주의: 동기화되어야 할 몇 단락의 코드는 각각 몇 가지 독립된 방법에 두는 것이 가장 좋다. 이런 방법은 다시 같은 종류에 두면 비교적 쉽게 그들 간의 동기화와 통신을 실현할 수 있다.

좋은 웹페이지 즐겨찾기