2016-05-12 8 views
0

У меня есть Class по имени Foo, который вызывает метод non-staticbarMethod() от Bar. Bar распространяется Fiber.
Внутри barMethod() есть звонок park(). Теперь, где Fiber будет припаркован? Foo экземпляр или Bar экземпляр?

Подпись park() (Она определяется static и это главная причина моего замешательства):
Quasar SuspendExecution

public static void park() 
       throws SuspendExecution 

Если ответ Foo (кажется, так), как я могу оставить Bar? Я в основном намерен suspend (park)Bar не Foo.
И если вы дадите мне ответ о том, как парковать Bar экземпляр, то, пожалуйста, скажите мне, что, поскольку я хочу припарковать Bar, а не Foo, should barMethod() throw SuspendExecution? Он не будет доступен ни одному экземпляру Bar, и я не хочу припарковать в этом методе Foo (только Bar).

Просьба также предоставить ответ на все те же вопросы о unpark(). Будет ли он применяться к текущему Fiber (Foo экземпляру в этом случае) или он влияет на экземпляр Bar? Если последний, то как я могу отформатировать экземпляр Bar, а не Foo экземпляр?

ответ

0

Как и в случае с нитками, волокно может только припарковаться. Вызов park приостанавливает выполнение текущего волокна. Класс, в котором установлен текущий метод, совершенно не имеет значения. Таким образом, ответ на ваш вопрос о том, «какое волокно будет припаркован, Bar или Foo», «какое бы волокно в настоящее время не выполняет». Это может быть экземпляр Bar, экземпляр Foo или какое-то другое волокно.

Как и в случае с Thread, единственным способом, который стоит переопределить, является run. Подкласс Fiber (или Thread) по любой другой причине не имеет смысла. Лучше всего, если вы думаете о волокнах и потоках как о той же идее, реализованной двумя разными способами. A Thread представляет собой поток, реализованный ОС, а Fiber представляет собой (более крупную) нить, реализованную в JVM, но они оба ведут себя по существу одинаково.

Наконец, park и unpark являются низкоуровневый API (так же, как LockSupport.park/unpark что делать то же самое для простых нитей), и если вы не пишете новый механизм параллельности (как новый вид замка), вы не должны используйте их напрямую. Вместо этого следует использовать любого из интерфейсов API синхронизации волокна более высокого уровня, как и каналы, замки и т.да ..

-1

Quasar отпугивает вызов парка и распарковать непосредственно

килима является подобным инструментом, который обеспечивает Fiber.yield (эквивалент парковка) и вы можете запустить задачу напрямую. поэтому я думаю, что он может делать то, что вы ищете

в вашем примере, barMethod должен быть помечен как Pausable, но вызывающий метод не должен быть

мы недавно сделали предварительный выпуск килима 2.0 ,в частности, вы должны посмотреть класс продолжения и пример XorShift

https://github.com/nqzero/kilim