5

rhino javascript コンテキストを理解している人はいますか? それに関する有用なドキュメントが見つかりません。私の主な問題は Context.exit() (実際には cx.exit() である必要があります) です。これは、現在のスレッドに関連付けられているコンテキストを終了することを理解していますか? それは、どのスレッドが何をするかを追跡する必要があるということですか?

メインスレッド:

Context cx;
cx.evaluateReader( ... ) // load some function
start thread 2

スレッド 2:

Object o= scope.get("methodname", scope);
((Function)o).call( ... )

マルチスレッドを実行する予定はありませんが、異なるセットアップが異なるスレッドから来ている場合はどうなりますか?

4

1 に答える 1

14

ウェブサイトのドキュメントから:

Rhino Contextオブジェクトは、実行環境に関するスレッド固有の情報を格納するために使用されます。JavaScriptを実行する各スレッドに関連付けられているコンテキストは1つだけである必要があります。

つまり、スレッド間でコンテキストを渡さないでください。実行中のスレッドで新しいコンテキストを作成するだけです。Context.enter()スレッド内で複数回呼び出すことを心配する必要はありません。これらは事実上、内部で参照カウントされるスレッドローカル変数です。したがってContext.enter()、同じスレッドでの呼び出しは非常に簡単です。

再びドキュメントから:

これらの呼び出しは、現在のスレッドに関連付けられたコンテキストがすでに存在する場合でも正しく機能します。そのコンテキストが返され、内部カウンターがインクリメントされます。カウンターがゼロに達したときにのみ、スレッドから関連付けが解除されます。

個人的には、このコード構造をどこでも使用しました。

Context ctx = Context.enter();
try {
    // do something with the ctx
} finally {
    Context.exit();
}

実際、Groovyで私はこれを一緒に泡立てました:

def withContext(Closure closure) {
    Context ctx = Context.enter();
    try {
        closure.call(ctx);
    } finally {
        Context.exit();
    }
}

次に、次のようなコードを渡します。

withContext { Context ctx ->
    ScriptableObject scope = ctx.initStandardObjects()
    // now to do work with the scope and ctx.
}

最後に1つ。スコープはコンテキストに関連付けられておらず、スレッド間で永続化/渡すことができます。

于 2010-03-25T21:48:46.530 に答える