next up previous
: 並行プログラミング : オブジェクト指向言語 Java : 継承の問題点(2)

並列オブジェクト指向

オブジェクト指向は,本来はその記述言語である「オブジェクト指向言語」と は区別し「概念」であった.そして,いかに実際の現象を「うまく」表現する かがその意義である「シミュレーション」をその祖先としている.そのように 考えると,各オブジェクトは,「並列に」動作することが前提でモデル化され ている場合が多い.そのようなモデルを 並列オブジェクト指向モデル(parallel object-oriented model) という.

並列オブジェクト指向の起源ともいえるモデルとして アクターモデル (actor) がある.そのモデルは,MIT のヒューイットにより考え出された概念で, 数学的なモデルで定義した最初である.このモデルが考えだされた 1970 年代 には,まだオブジェクトの概念もまとまっていなかった時代でオブジェクトに 相当するものは アクター(actor) といった. その後,さらに発展した概念として ABCM(An oBject oriented Concurrent Model) が提案された.このモデルは東大の米澤により考え出された. このモデルも同様に数学的モデルとして定義されている.

最後に,上で紹介した例題で各オブジェクトをスレッドとしてみよう.

public class Person extends Thread {
  private int AirplaneColor,AirplaneSpeed;
  private boolean TreeStatus;
  private Airplane knownAirplane;
  private Tree knownTree;
  Person(Tree t,Airplane a) {
    knownTree = t; knownAirplane = a;
  }
  public void run() {
    for(int i=0; i<21;i++) {
      try {
        sleep(1);
      } catch (Exception e) {}
      TreeStatus=knownTree.WhatIsYourStatus();
      AirplaneSpeed=
        knownAirplane.WhatIsYourSpeed();
      AirplaneColor=
        knownAirplane.WhatIsYourColor();
      System.out.println(
        "TStatus: "+TreeStatus+
        ",ASpeed: "+AirplaneSpeed+",AColor: "+
        Color.toString(AirplaneColor));
    }
  }
  public static void main(String args[]) {
    Tree t = new Tree();
    Airplane a = new Airplane(t);
    Person p = new Person(t,a);
    a.start(); p.start();
  }
}
class Color {
  static int White=0,Red=1,Green=2,Blue=4;
  static String toString(int Col) {
    switch(Col) {
      case 0: return "White";
      case 2: return "Read";
      case 4: return "Green";
      case 8: return "Blue";
      default: return "unknownColor";
    }
  }
}
class Airplane extends Thread {
  protected int Speed;
  private int Col = Color.White;
  private Tree knownTree;
  private boolean Upper=true;
  Airplane(Tree t) {
    knownTree = t;
  }
  public void run() {
    for(int i=0;i<21;i++) {
      try {
        sleep(1);
      } catch (Exception e) {}
      if(Upper==true) {
        if(Speed++==9) Upper=false;
      } else
        if(--Speed<=0) Speed=0;
      if(Speed>0) knownTree.Wind();
      else knownTree.stopWind();
    }
  }
  public int WhatIsYourSpeed() {
    return Speed;
  }
  public int WhatIsYourColor() {
    return Col;
  }
}
class Tree {
  private boolean Status = false;
  public boolean WhatIsYourStatus() {
    return Status;
  }
  public void Wind() {
    Status = true;
  }
  public void stopWind() {
    Status = false;
  }
}
ここでは,クラス Person のインスタンスと, クラス Airplane のインスタンスをスレッドとし 起動している.そのため Person のインスタンスと Airplane のインスタンスは独立に動作することになった. このプログラムを実行すると,以下のようになる.
TStatus: true,ASpeed: 1,AColor: White
TStatus: true,ASpeed: 7,AColor: White
TStatus: true,ASpeed: 8,AColor: White
TStatus: true,ASpeed: 9,AColor: White
TStatus: true,ASpeed: 10,AColor: White
TStatus: true,ASpeed: 9,AColor: White
TStatus: true,ASpeed: 8,AColor: White
TStatus: true,ASpeed: 7,AColor: White
TStatus: true,ASpeed: 6,AColor: White
TStatus: true,ASpeed: 4,AColor: White
TStatus: true,ASpeed: 3,AColor: White
TStatus: true,ASpeed: 2,AColor: White
TStatus: true,ASpeed: 2,AColor: White
TStatus: true,ASpeed: 1,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
TStatus: false,ASpeed: 0,AColor: White
この結果からわかるように,飛行機のスピードが,スピードアップの時に, より早くアップしているようにみることができるが,実際にはそうではない (更に,実行する毎に実行結果は異なる). これは,並列オブジェクト Airplane と 並列オブジェクト Person の同期がとれていないためである.しかし,よく考えてみる とそのように,人間が飛行機のスピードを把握する場合,そのスピードが一定 にアップする毎に知ることができるとは限らない,方が常である.よって, 並列オブジェクトモデルが,実際の現象を忠実に反映していることがわかる.

実際のプログラミングで,並列オブジェクトを単に「スレッド」で定義しただ けではその同期問題を別に解決しなければならないことが明らかになった. しかし,提案された並列オブジェクトモデルでは, 各異なった同期処理を提供している.読者の課題としよう.



平成12年8月9日