Dal website docs:
L'oggetto Context rinoceronte viene utilizzato per memorizzare informazioni specifiche discussione riguardo l'ambiente di esecuzione. Dovrebbe esserci un solo Contesto associato a ciascun thread che eseguirà JavaScript.
In altre parole, non passare il contesto tra i thread. Basta creare un nuovo contesto nel thread in esecuzione. Non preoccuparti di chiamare lo Context.enter()
più di una volta all'interno di un thread. Sono effettivamente variabili locali del thread che sono conteggiate internamente. Quindi chiamare Context.enter()
nella stessa discussione è molto leggero.
Sempre dal docs:
Queste chiamate funzionerà correttamente anche se esiste già un contesto associato al thread corrente. Questo contesto verrà restituito e un contatore interno incrementato. Solo quando il contatore raggiunge lo zero verrà dissociato dal thread.
personalmente, ho usato questo codice costrutto dappertutto:
Context ctx = Context.enter();
try {
// do something with the ctx
} finally {
Context.exit();
}
Infatti, in Groovy Voltai insieme questo:
def withContext(Closure closure) {
Context ctx = Context.enter();
try {
closure.call(ctx);
} finally {
Context.exit();
}
}
e quindi farlo passare codice come il seguente:
withContext { Context ctx ->
ScriptableObject scope = ctx.initStandardObjects()
// now to do work with the scope and ctx.
}
Un'ultima nota. L'ambito non è legato al contesto e può essere persistuto/passato tra i thread.
fonte
2010-03-25 21:48:46