Методы выполнения в Fiber, SuspendableRunnable и SuspendableCallable
объявить, что они могут вызвать исключение SuspendExecution.
@ Suspendable - это наш способ указать метод suspendable, объявив throws SuspendExecution. Это удобно, поскольку SuspendExecution является проверенным исключением, поэтому, если f вызывает g и g является приостановленным, компилятор Java заставит нас объявить, что f приостановлено (и это должно быть потому, что он вызывает g, а g может быть приостановлено).
Иногда, однако, мы не можем объявить, что f выбрасывает SuspendExecution. Одним из примеров является то, что f является реализацией метода интерфейса, и мы не можем (или не хотим) изменять интерфейс, чтобы он вызывал SuspendExecution.
Итак, предположим, что метод f объявлен в интерфейсе I, и мы хотели бы сделать его реализацию в классе C приостановленной. Компилятор не позволит нам объявить, что мы бросаем SuspendExecution, потому что это будет конфликтовать с объявлением f в I.
Таким образом, мы делаем аннотацию C.f с аннотацией @Suspendable (в пакете co.paralleluniverse.fibers). Предполагая, что C.f вызывает park или какой-то другой приостанавливаемый метод g, который объявляет throws SuspendExecution, нам нужно окружить тело f командой try {} catch (SuspendExecution), чтобы метод скомпилировался.
если мы хотим запустить h в волокне, то он должен быть приостановлен, потому что он вызывает f, который является приостановленным. Мы могли бы обозначить h как приостанавливаемый, либо пометив его @Suspendable, либо объявив SuspendExecution
Если мы хотим, чтобы какой-либо метод выполнялся в волокне, он должен быть приостановлен.
в общем, любой метод, который вызывает метод, который может выдать SuspendExecution или помечен @Suspendable
.