Есть ли в java своего рода setjmp/longjmp?

Я признаю, что если бы это было возможно, это было бы открытой дверью для плохого, очень плохого кода... Но в некоторых конкретных случаях...

Итак, вопрос в том, есть ли эквивалент c setjmp/longjmp ?

Я хотел бы реализовать python-подобный генератор без использования потоков, просто сохраняя стек и контекст и восстанавливая его позже.


person hl037_    schedule 26.12.2015    source источник
comment
да. Этот механизм называется исключениями.   -  person fuz    schedule 26.12.2015
comment
Нет. Исключение может использовать этот механизм, но исключение в основном является системой обработки ошибок. setjmp/longjmp позволяет также выполнять сопрограммы, которые, если вы не можете доказать обратное, невозможны с использованием исключений.   -  person hl037_    schedule 26.12.2015
comment
Исключения составляют немного более структурированные прыжки в длину. Ни больше ни меньше. Обычно они используются для обработки ошибок, но это не обязательно.   -  person fuz    schedule 26.12.2015
comment
@FUZxxl - Вы упускаете суть. Есть много вещей, которые вы можете сделать с помощью setjmp/longjmp, но вы не можете сделать с помощью исключений Java.   -  person Stephen C    schedule 26.12.2015
comment
@StephenC Я знаю, что вы можете взломать какую-то систему сопрограмм с помощью setjmp / longjmp, но это не переносимое использование setjmp, и на самом деле современные libc приводят к сбою программы, если такое неправильное использование обнаружено.   -  person fuz    schedule 26.12.2015
comment
@hl037_ hl037_ Это во многом XY-вопрос — вы спрашиваете о функции, потому что хотите найти решение проблемы, основанное на ваших знаниях другого языка. В java есть альтернативы.   -  person Petesh    schedule 26.12.2015
comment
@Petesh Я думаю, вы правы: мне не нравится java, и я пытался использовать методы из другого языка. Немного расстраивает отсутствие переносимой системы сопрограмм на java. В любом случае, я смог сделать то, что мне было нужно, с помощью пользовательского итератора (я знал, что это возможно таким образом, я просто хотел спросить, будет ли такая система для создания генератора, подобного python, в будущем)   -  person hl037_    schedule 26.12.2015


Ответы (2)


Простой ответ: нет! Самое близкое, что вы можете получить, это помеченные разрывы, которые представляют собой своего рода переходы вперед для выхода из нескольких вложенных блоков, но это все!

person loonytune    schedule 26.12.2015

Библиотека Javaflow из apache commons, хотя и не является строго эквивалентной библиотеке C longjump, дает возможность прервать поток кода (как это делают исключения, но с захватом стека) и перезапустить его позже. Это подходит для реализации Coroutines. Однако для этого требуется модификация байт-кода.

http://commons.apache.org/sandbox/commons-javaflow/index.html

person Ludovic Pollet    schedule 13.09.2016