KODAMA LAB
JavaScript 版 — 2026

並行オブジェクト指向
プログラミング

1998年に Java アプレットで公開していたデモ7本を、 ブラウザでそのまま動く JavaScript に書き直しました。 頂点の座標も、回転角も、セマフォの初期値も、当時の .java と同じ値です。 下の絵はすべていま動いています

7動くデモ
1998元の公開年
0インストール
Java アプレットは、もうどのブラウザでも動きません。 2017年以降すべての主要ブラウザが対応をやめたため、元のページの「実行」リンクは開いても何も出ません。 当時のページと .java のソースはそのまま残してあります。
READ FIRST

「同時に動く」の意味が、Java と JavaScript では違う

One thread, many things

この作り直しでいちばん大事なのは、見た目が同じでも中身が違うことです。

Java(1998年の版)

オブジェクトごとに Thread を立て、OS が本当に同時に走らせていました。 いつ切り替わるかは分からないので、共有するものにはセマフォが要ります。

JavaScript(この版)

実行の線は1本だけです。タイマーを6本仕掛けても、順番に呼ばれているだけ。 それでも「代わりばんこ」が十分速ければ、同時に動いて見えます。

だから起きないこと

1本しかないので、途中で割り込まれて壊れるという競合状態は起きません。 デモ⑤⑥のセマフォは、当時の考え方をなぞって見せるためのものです。

もっと詳しく

言語ごとの違いは Java 版JavaScript 版Python 版の講義資料で扱っています。

DEMO 01

一つのオブジェクトの回転

One rotating object

簡単なクラスを用いて 3D オブジェクトを生成する。断面の10点を Y 軸まわりに 36°ずつ回して回転体を作り、X・Y・Z の各軸まわりに 12°ずつ回し続ける。

回した回数 0

元のアプレットは Thread を1本立て、80 ミリ秒ごとに Rotate()repaint() を呼んでいた。ここでも同じ 80 ミリ秒で回している。

1998年の版: Sample.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample.java FreeSoR.java

DEMO 02

一つのオブジェクト(ダブルバッファ)

Double buffered

次は、ダブルバッファを用いて処理をする。

回した回数 0

画面に直接描くと、消してから描き終わるまでの一瞬が見えてしまい、ちらつく。見えない紙に描いてから一気に貼り替えるのがダブルバッファ。いまのブラウザの canvas はもともと二重に持っているので、上のデモとの差は分かりにくい ── そこが1998年との違いでもある。

1998年の版: Sample05.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample05.java

DEMO 03

複数のオブジェクトの回転

Six objects at once

これら 3D オブジェクトは、並行に処理される。ここでは、六個のオブジェクトを生成する。

元は TR のスレッドを6本立て、それぞれが 40 ミリ秒ごとに勝手に回っていた。描く係は別に1本。Java は本当に同時に走っていたが、JavaScript は1本しかないので、6個ぶんのタイマーを順番に処理している。見え方は似ていても、中身は「代わりばんこ」である。

1998年の版: Sample1.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample1.java TR.java

DEMO 04

複数のオブジェクト(ダブルバッファ)

Six objects, double buffered

次は、ダブルバッファを用いて処理をする。

6個ぶんを見えない紙にまとめて描いてから貼り替える。描く量が増えるほど、ダブルバッファの効き目は大きくなる。

1998年の版: Sample15.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample15.java

DEMO 05

同期 v.s. 非同期

Synchronous vs asynchronous

セマフォを使って、同期・非同期を切替える。さらに、ダブルバッファの機能は追加してある。

6個のオブジェクトを輪にして、セマフォの札を1枚だけ回している(0番だけが初期値 1 を持つ)。札を受け取ったものだけが1回まわり、次へ渡す。ボタンで Async にすると札を無視して全員が回りはじめる。

1998年の版: Sample2.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample2.java

DEMO 06

有限バッファ

Bounded buffer

有限バッファ問題を表現する。作る側と使う側が、10個ぶんの置き場を共有する。

置き場の空き数を数えるセマフォ(S= 緑)と、中身の数を数えるセマフォ(S= 橙)の2つで待ち合わせる。作る方を速くすると置き場が埋まって作る側が待ち使う方を速くすると空になって使う側が待つ。元のアプレットのスクロールバーと同じように、下の2本で速さを変えられる。

1998年の版: Sample3.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample3.java

DEMO 07

有限バッファ(●を入れる)

Bounded buffer with dots

次に入力として●を使う。

入れるものが数字でも●でも、待ち合わせの仕組みは変わらない。何を運ぶかと、どう待ち合わせるかは別の話だと分かる。

1998年の版: Sample4.htmlアプレットなので今のブラウザでは動きません) / 当時の Java ソース: Sample4.java