以下のように書くとエラーだった。

1個の関数内で、ParallelExecutorを2個作る。例えばa,b。

function test(){
a:ParallelExecutor = new ParallelExecutor();
b:ParallelExecutor = new ParallelExecutor();
~省略~
a.start();
a.join();
b.start();
b.join();
}

b.join()をコメントアウトするので動くので、1個の関数内で複数joinはダメぽ。
また↓のように関数分けて、next()で移動してもOK(当然か)

function test(){
var a:ParallelExecutor = new ParallelExecutor();
~省略~
a.start();
a.join();
next(test2);
}
function test2(){
var b:ParallelExecutor = new ParallelExecutor();
b.start();
b.join();
}

以下、偉人からのアドバイスメモ(今はまだ全理解しきれてない・・・)
joinのときは A.hoge() -> B.join() -> B.joinMonitor.wait() という感じでBを待つ状態。
Queue的なときはA.hoge() -> B.checkPoll() -> (データが鳴ければ)B.monitor.wait() で待ち状態。
それぞれ waitしようとしたときに、Aがすでに何かの待ちになっているとそれはエラー。
Threadはクラスメソッド内でいろいろしていて、どこかの処理でwaitが呼ばれたときに、呼び元(今動いてる)のThreadを待たせるといのが基本動作。
呼ばれた人が呼んだ人を状況により待たせるイメージ。
あるスレッドは同時に1つのスレッドしか待てない。
逆にあるスレッドを待ってるスレッドは何個でも待てる。

//2009/1/17追記
joint()とsleep()は同時に使えないみたい。