2010-01-14 112 views
5

任何人都明白犀牛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(...) 

我不打算做多線程,但如果在不同的設置有什麼來自不同的線程?

回答

13

website docs

犀牛上下文對象用於存儲關於執行環境特定的線程信息。應該有一個且只有一個Context與每個將執行JavaScript的線程相關聯。

換句話說,不要在線程之間傳遞上下文。只需在運行線程中創建一個新的上下文。不要擔心在線程中多次調用Context.enter()。它們實際上是內部引用計數的線程局部變量。所以在同一線程中調用Context.enter()就是非常光

docs

還是那句話:

這些電話將正常工作,即使已經存在與當前線程相關的上下文。該上下文將被返回並且內部計數器遞增。只有當計數器達到零時,它纔會脫離線程。

就個人而言,我只是用這個代碼構造無處不在:

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. 
} 

最後一個注意事項。範圍不受上下文限制,可以在線程間持久/傳遞。