解決方案1不可行;每個工作區的一個JobThread的假設深深嵌入代碼中。
爲了讓JobThread死了,這應該是足夠了:
workspace.jobManager.haltPrimary()
workspace.jobManager.die()
爲了讓GUIWorkspace.Lifeguard線程死了,我們只需要調用interrupt()
就可以了,但即使是剛開的引用並不那麼容易。這裏是展示一個成功的嘗試成績單:
/Applications/NetLogo 5.0.5 % scala29 -Yrepl-sync -classpath NetLogo.jar
Welcome to Scala version 2.9.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51).
scala> val applet = new org.nlogo.lite.Applet
applet: org.nlogo.lite.Applet = ...
scala> applet.init()
...
scala> val ws = applet.panel.workspace: org.nlogo.window.GUIWorkspace
ws: org.nlogo.window.GUIWorkspace = [email protected]
scala> import collection.JavaConverters._
import collection.JavaConverters._
scala> Thread.getAllStackTraces().keySet.asScala.foreach(println)
Thread[JobThread,4,main]
Thread[Lifeguard,6,main]
...
scala> ws.jobManager.haltPrimary()
scala> ws.jobManager.die()
scala> import util.Try
import util.Try
scala> for {
thread <- Thread.getAllStackTraces().keySet.asScala
if thread.getName == "Lifeguard"
outer = Try{ val field = thread.getClass.getDeclaredField("this$0")
field.setAccessible(true)
field.get(thread) }
if outer.toOption == Some(ws)
} {
thread.interrupt()
thread.join()
}
Success([email protected])
scala> Thread.getAllStackTraces().keySet.asScala.foreach(println)
...
(請注意,我在斯卡拉已經回答;轉換到Java留給讀者訪問一個內部類的外部實例反射的東西來自https://stackoverflow.com/a/763617/86485。)
,增加了代碼執行GUIWorkspace.dispose()
在一個更清潔的方式將受到歡迎pull請求。
完美的作品!謝謝! '這個$ 0'非常聰明。 –