並列オブジェクト指向の起源ともいえるモデルとして アクターモデル (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 の同期がとれていないためである.しかし,よく考えてみる とそのように,人間が飛行機のスピードを把握する場合,そのスピードが一定 にアップする毎に知ることができるとは限らない,方が常である.よって, 並列オブジェクトモデルが,実際の現象を忠実に反映していることがわかる.
実際のプログラミングで,並列オブジェクトを単に「スレッド」で定義しただ けではその同期問題を別に解決しなければならないことが明らかになった. しかし,提案された並列オブジェクトモデルでは, 各異なった同期処理を提供している.読者の課題としよう.