我承認,如果可能的話,這將是敞開的門壞了,很糟糕的代碼。但在某些特定情況下...在java中是否有一種setjmp/longjmp?
所以現在的問題是,是否有c的setjmp/longjmp的任何等同?
我想在不使用線程的情況下實現一個類似python的生成器,只保存堆棧和上下文,然後再恢復。
我承認,如果可能的話,這將是敞開的門壞了,很糟糕的代碼。但在某些特定情況下...在java中是否有一種setjmp/longjmp?
所以現在的問題是,是否有c的setjmp/longjmp的任何等同?
我想在不使用線程的情況下實現一個類似python的生成器,只保存堆棧和上下文,然後再恢復。
簡單的回答:不,沒有!你可以得到最接近的東西是標記爲中斷,這是一種向前跳轉以突破多個嵌套塊,但那就是它!
雖然不完全等同於C longjump,但來自apache commons的Javaflow庫提供了一種方法來中斷代碼流(如異常,但捕獲堆棧),並稍後重新啓動。 這適用於實現協同程序。但是,它需要修改字節碼。
http://commons.apache.org/sandbox/commons-javaflow/index.html
是的。該機制被稱爲*例外。* – fuz
。例外可以使用這種機制,但例外主要是錯誤處理系統。 setjmp/longjmp還允許執行協同程序,除非可以證明,否則使用異常是不可能的。 –
異常是稍微更結構化的長跳轉。沒有更多,沒有更多。它們通常用於錯誤處理,但這不是必要的。 – fuz