私は動的に埋め込まれた Scala を使用しておりFunction0
、ホスト プログラムの . おおよそ次のようになります。
object Code
def intp: IMain = ???
object Capture {
private val vr = new ThreadLocal[() => Any]
def apply[A](thunk: => A) {
vr.set(() => thunk)
}
def result: () => Any = vr.get()
}
def capture(code: String): Future[() => Any] = future {
blocking {
intp.setExecutionWrapper("Code.Capture")
intp.interpret(code)
Capture.result
}
}
}
この「なんとなく」は機能しますが、JVM が正常に動作しなくなった直後に、基本的にハングアップし、Perm Gen エラーなどが発生します。キャプチャ メカニズムを使用しない場合、すべてがスムーズに実行されます (ただしinterpret
、コンパイルされた関数を保持する代わりに、メソッドを何度も再実行する必要があります)。そのため、問題はありません。
ステップデバッガーを実行して、疑わしいものがあるかどうかを確認しようとしましたが、違います。ある時点で、プログラムは完全にフリーズします。Promise
また、完了を待機するメインブロックの補助を使用してコンパイル用の別のスレッドを起動することで、先物ケースを分離しましたがcapture
、何も変更されませんでした。
どんな助けでも大歓迎です。クラスローダーなどと混同しているのかもしれません。(myは、ホスト クラスにアクセスできるようにIMain
オーバーライドします)。parentClassLoader
apply
メソッド ( writeObject
) で関数をシリアル化し、ホストで逆シリアル化する必要があるという最終的な直感がありました。しかし、readObject
それから
java.lang.ClassNotFoundException: $line1.$read$$iw$$iw$$anonfun$1
おそらく下の問題をほのめかしていますか?