2011-08-04 26 views
30

我對(Rhino)腳本引擎和相關類的生命週期和併發語義感興趣。具體來說:什麼是Rhino腳本引擎的生命週期和併發語義

  1. Bindings應該是線程安全的嗎?
  2. 是否允許多個線程共享一個ScriptEngine實例?
  3. ...或者每個線程應該構造一個短命的實例嗎?
  4. ...或讓他們在游泳池?
  5. 如果多個線程同時調用ScriptEngine.eval(...)會發生什麼情況?
  6. CompiledScript實例的相同問題
  7. 使用Invocable.getInterface(...)生成的接口實現的相同問題?
  8. 推測,放置在Bindings中的對象遵循Java的垃圾收集。怎麼樣的垃圾收集的對象不會結束在綁定?
+2

我不知道,但JavaDocs建議您可以詢問其線程安全保證的實現:http://download.oracle.com/javase/6/docs/api/javax/script/ ScriptEngineFactory.html#getParameter(java.lang.String)查看getParameter方法並使用THREADING播放。 –

回答

23

所以我已經運行試驗和Rhino引擎報告「Mozilla的犀牛」是多線程的,其中的JavaDoc聲稱

「MULTITHREADED」 - 引擎實現是內部線程安全 和腳本可能同時執行腳本雖然效果 執行一個線程可能會在其他線程腳本可見。」

下面的代碼......它看起來線程對我來說,只要綁定你在AR傳遞e線程安全。

package org.rekdev; 
import java.util.*; 
import javax.script.*; 
public class JavaScriptWTF { 
    public static void main(String[] args) { 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     List<ScriptEngineFactory> factories = mgr.getEngineFactories(); 
     for (ScriptEngineFactory factory : factories) { 
      System.out.println(String.format(
        "engineName: %s, THREADING: %s", 
        factory.getEngineName(), 
        factory.getParameter("THREADING"))); 
     } 
    } 
} 

...輸出是...

引擎名稱:AppleScriptEngine,THREADING:空
引擎名稱:Mozilla的犀牛,THREADING:MULTITHREADED

要回答你的確切問題...

  1. 綁定應該是線程安全的嗎?
    聽起來這是你的責任,讓他們線程安全。換句話說,只傳入不可變的對象以及引擎是否是線程安全的都不成問題。

  2. 是否應允許多個線程共享一個ScriptEngine實例?
    聽起來對我來說他們可以,但關鍵是可以通過綁定發生的狀態共享。不變的物體是你的朋友。

  3. ...或者每個線程應該構造一個短命的實例嗎?
    在我看來,最好的辦法就是每次執行eval都是一個短暫的實例。

  4. ...或將它們放在水池中?
    在這個時代,嘗試自己集中資源並不是一個好主意。給短命例子一個鏡頭,衡量它的表現,然後從那裏開始工作。

  5. 如果多個線程同時調用ScriptEngine.eval(...),會發生什麼情況?
    如果我正確理解Rhino引擎的repsonse到MULTITHREADING,ScriptEngine.eval應該可以併發調用。

  6. 爲CompiledScript實例

    同樣的問題
    的Javadoc指出,「在ScriptEngine的狀態造成CompiledScript執行的變化可能在發動機腳本後續執行可見。」 http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html。因此,在似乎試圖將ScriptEngine實例數量減至最少的環境中,它們聽起來並不是線程安全的。

  7. 使用Invocable.getInterface(...)生成的接口實現的相同問題? 你在這裏你自己。我不明白爲什麼或什麼時候使用這種能力,聽起來像你可能會在這裏「跳鯊魚」。如果您想深入研究腳本語言,我建議您放棄JavaScript並查看Groovy以獲取更具腳本化的Java。

  8. 推測,放置在Bindings中的對象遵循Java的垃圾回收。怎麼樣的垃圾收集的對象不會結束在綁定?
    如果它們不以綁定結束,我希望它們綁定到ScriptEngine並遵循其生命週期(基於我已閱讀的文檔)。彙集ScriptEngine實例聽起來不是一個好主意。

+0

我想要一個更明確的答案關於池和實例化,但你已經覆蓋了大部分的基礎。感謝您的研究。 –

相關問題