{"id":297456,"date":"2020-01-21T15:00:44","date_gmt":"2020-01-21T15:00:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=297456"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-01-21T15:00:44","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=297456","title":{"rendered":"DIY \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0427\u0430\u0441\u0442\u044c 1. \u041b\u0435\u043d\u0438\u0432\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/480888\/\">\n<p>\u0412 \u043c\u0438\u0440\u0435 JVM \u043f\u0440\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u043d\u0430\u044e\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044f\u0437\u044b\u043a\u0443 Kotlin \u0438 <a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/422519\/\">Project Loom<\/a>. \u0425\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043b\u0438\u043d\u043e\u0432\u0441\u043a\u0438\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u044f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u0430 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 kotlin-coroutines \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u0437\u043d\u0430\u0435\u0442 \u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e &quot;\u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438&quot;, \u0438 \u0447\u0442\u043e \u0432 \u043a\u043e\u0442\u043b\u0438\u043d\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0443\u043c\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. \u0422\u0430\u043a\u0438\u043c \u0431\u044b\u043b \u0438 \u044f \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0418 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0438\u0434\u0435\u044f, \u0447\u0442\u043e \u0440\u0430\u0437 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 java. \u0418\u0437 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438, \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2_\/7f\/s4\/2_7fs4po74_uoaqwmucjmnyjcuw.jpeg\"><\/div>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"ishodnyy-kod\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u044f \u043d\u0430\u0437\u0432\u0430\u043b Microutines, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438\u0437 \u0441\u043b\u043e\u0432 Micro \u0438 Coroutines.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/alexander-shustanov\/microutines\">github<\/a>. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043c\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u0435\u043c\u044b, \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043c\u043e\u0438\u0445 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u0438 \u0438\u0434\u0435\u044f\u0445, \u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 api, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043a\u043e\u0434 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0431\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0441\u044f \u043e\u0442 \u043a\u043e\u0434\u0430 \u0441 github (\u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e, \u0441\u0442\u0430\u0442\u044c\u044e \u044f \u043f\u0438\u0448\u0443 \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431 \u043a\u043e\u043c\u0438\u0447\u0443 \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 \u0435\u0441\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 api \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430, \u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<p>  <\/p>\n<h3 id=\"disclaimer\">Disclaimer<\/h3>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u042f \u0431\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0437\u0430\u043a\u0438\u043d\u0435\u0442 \u043f\u0443\u043b\u043b \u0440\u0435\u043a\u0432\u0435\u0441\u0442. \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442. \u041b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0441\u0430\u043c\u043e\u043c\u0443, \u0432 \u0447\u0435\u043c \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0435\u0449\u0435 \u044f \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437 \u043d\u0438\u0445 \u044f \u0433\u0434\u0435-\u0442\u043e \u0443\u0441\u043b\u044b\u0448\u0430\u043b, \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b, \u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0430\u043c \u0438 \u0437\u0430\u0431\u044b\u043b.<\/p>\n<p>  <\/p>\n<h3 id=\"chto-takoe-korutiny\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u043f\u0440\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0447\u0430\u0441\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u044d\u0442\u043e &quot;\u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438&quot;. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0432\u0435\u0440\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435. \u0412\u0435\u0440\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u044f \u043f\u0440\u0430\u0432\u0434\u0430 \u0442\u043e\u0436\u0435 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043e\u043f\u0438\u0441\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043e\u043d\u0438, \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u044d\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u043f\u043e\u0442\u043e\u043a, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0447\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (scheduling). \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f\u2026 \u043c\u044b \u0441\u0430\u043c\u0438 \u0437\u0430\u0439\u043c\u0435\u043c\u0441\u044f \u0438\u0445 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0438 \u0438\u0445 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0433\u0434\u0430 \u0436\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0430 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0441\u0442\u044c\u044e. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043f\u043e\u0442\u043e\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c. \u041f\u043e\u0442\u043e\u043a \u0434\u043b\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430, \u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. \u0412\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/41\/xu\/3j\/41xu3j8m3cgly0vdiixkaomex2o.png\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0438 contribs 1 \u0438 contribs 2 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0442\u043e\u043a, \u0430 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0435\u0451 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432, \u0441\u043a\u0430\u0436\u0435\u0442\u0435 \u0432\u044b. \u0422\u0430\u043a \u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u0441\u0443\u0442\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0431\u0435\u0437 \u043a\u043e\u043b\u0431\u0435\u043a\u043e\u0432, \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<h3 id=\"generatory\">\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h3>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u0447\u043d\u0435\u043c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a \u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0449\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u043d\u0438\u0432\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u0430\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430 yield. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0443\u0442 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e, \u043a\u0430\u043a \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 python, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">def generator():     k = 10     yield k     k += 10     yield k     k += 10     yield k  for i in generator():     print(i)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0426\u0438\u043a\u043b \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 (\u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430\u043a, \u043d\u043e \u043d\u0430\u043c \u0432\u0430\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f):<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">gen = generator() while True:     try:         i = next(gen)         print(i)     except StopIteration:         break<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>generator()<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043e\u0441\u043e\u0431\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>next(gen)<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>generator<\/code> \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e <code>yield<\/code>, \u0438 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>i<\/code> \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>k<\/code> \u0438\u0437 <code>genertator()<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 <code>next<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c <code>yield<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <code>next<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 <code>generator<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Kotlin.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">val seq = sequence {     var i = 10      yield(i)     i += 10     yield(i)     i += 10     yield(i) }  for (i in seq) {     println(i) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 Java \u043b\u0435\u043d\u0438\u0432\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Iterable&lt;Integer&gt; seq = DummySequence.first(() -&gt; {     final int i = 10;     return DummySequence.next(i, () -&gt; {             final int i1 = i + 10;             return DummySequence.next(i1, () -&gt; DummySequence.end(i1 + 10));     }); });  for(int i: seq) {     System.out.println(i); }<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DummySequence<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">import org.junit.Assert; import org.junit.Test;  import java.util.Iterator; import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.StreamSupport;  public class DummySequenceTest {      @Test     public void dummySequenceTest() {         DummySequence&lt;Integer&gt; sequence = DummySequence.first(() -&gt; {             final int i = 10;             return DummySequence.next(10, () -&gt; {                 final int i1 = i + 10;                 return DummySequence.next(i1, () -&gt; DummySequence.end(i1 + 10));             });         });          List&lt;Integer&gt; list = StreamSupport.stream(sequence.spliterator(), false)                 .collect(Collectors.toList());          Assert.assertEquals(10, ((int) list.get(0)));         Assert.assertEquals(20, ((int) list.get(1)));         Assert.assertEquals(30, ((int) list.get(2)));     }      private static class DummySequence&lt;T&gt; implements Iterable&lt;T&gt;, Iterator&lt;T&gt; {         private Step&lt;T&gt; step;          public DummySequence(Step&lt;T&gt; step) {             this.step = step;         }          @Override         public Iterator&lt;T&gt; iterator() {             return this;         }          @Override         public boolean hasNext() {             if (step instanceof EndStep)                 return false;             step = step.nextStep();             return true;         }          @Override         public T next() {             return step.getValue();         }          public static &lt;T&gt; DummySequence&lt;T&gt; first(Supplier&lt;Step&lt;T&gt;&gt; next) {             return new DummySequence&lt;&gt;(new FirstStep&lt;T&gt;(next));         }          public static &lt;T&gt; Step&lt;T&gt; next(T value, Supplier&lt;Step&lt;T&gt;&gt; next) {             return new IntermediateStep&lt;&gt;(value, next);         }          public static &lt;T&gt; Step&lt;T&gt; end(T value) {             return new EndStep&lt;&gt;(value);         }     }      private interface Step&lt;T&gt; {         T getValue();          Step&lt;T&gt; nextStep();     }      public static class FirstStep&lt;T&gt; implements Step&lt;T&gt; {         Supplier&lt;Step&lt;T&gt;&gt; nextStep;          public FirstStep(Supplier&lt;Step&lt;T&gt;&gt; next) {             this.nextStep = next;         }          @Override         public T getValue() {             throw new IllegalStateException();         }          @Override         public Step&lt;T&gt; nextStep() {             return nextStep.get();         }     }      public static class IntermediateStep&lt;T&gt; implements Step&lt;T&gt; {         T value;         Supplier&lt;Step&lt;T&gt;&gt; nextStep;          public IntermediateStep(T value, Supplier&lt;Step&lt;T&gt;&gt; nextStep) {             this.value = value;             this.nextStep = nextStep;         }          @Override         public T getValue() {             return value;         }          @Override         public Step&lt;T&gt; nextStep() {             return nextStep.get();         }     }      public static class EndStep&lt;T&gt; implements Step&lt;T&gt; {         T value;          public EndStep(T value) {             this.value = value;         }          @Override         public T getValue() {             return value;         }          @Override         public Step&lt;T&gt; nextStep() {             throw new IllegalStateException();         }     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438\u0437 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043b\u044f\u043c\u0431\u0434 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u043b\u044f\u043c\u0431\u0434\u044b \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u043d\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0438 \u044f \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u043a\u0442\u043e-\u043b\u0438\u0431\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0442\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438\u0434\u0435\u0430\u043b, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f (\u0438 \u043c\u044b \u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u043c, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u044f\u043c\u0431\u0434 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441).<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Sequence&lt;Integer&gt; sequence = new Sequence&lt;Integer&gt;(() -&gt; {     int i = 10;      yield(i);     i += 10;     yield(i);     i += 10;     yield(i); });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Sequence, \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0434\u0442\u0438 \u043e\u0442 <code>yield<\/code> \u043a <code>yield<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 <code>sequence.next()<\/code>. \u0412\u043e\u0442 \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <em>\u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u0435<\/em> (yield \u0442\u0430\u043a \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439) \u0438\u043b\u0438 <em>\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/em>.<\/p>\n<p>  <\/p>\n<h3 id=\"kontinuacii\">\u041a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0428\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0442\u044c\u0441\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Continuation. \u041d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439 continuation \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a &#8216;\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435&#8217;, \u043d\u043e \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0435 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0435\u0439. \u0412 \u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u044f \u043f\u0440\u043e \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e:<\/p>\n<p>  <\/p>\n<blockquote><p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 (\u0430\u043d\u0433\u043b. continuation) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0432 \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.<\/p><\/blockquote>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u041c\u0435\u0442\u043e\u0434 <code>run<\/code> \u0443\u043c\u0435\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e <code>yield<\/code>. \u041c\u043e\u0436\u0435\u043c \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043e <code>Runnable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">interface Continuation&lt;T&gt; {     void run(SequenceScope&lt;T&gt; scope); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Sequence&lt;Integer&gt; sequence = new Sequence&lt;&gt;(new Continuation&lt;&gt;() {     void run(SequenceScope&lt;Integer&gt; scope) {         int i = 1;         System.out.println(&quot;Continuation start&quot;);         scope.yield(i++);         System.out.println(&quot;Continuation resume&quot;);         scope.yield(i++);         System.out.println(&quot;Continuation resume&quot;);         scope.yield(i++);         System.out.println(&quot;Continuation end&quot;);     }        });       for(Integer i: sequence) {     System.out.println(&quot;Next element :&quot; + i); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Output<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">Continuation start Next element: 1 Continuation resume Next element: 2 Continuation resume Next element: 3 Continuation end<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><code>Sequence<\/code> \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>Continuation.run(scope)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e yield \u0438 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0442\u044c\u0441\u044f. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Continuation.run(scope)<\/code> \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u0434\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e <code>yield<\/code>. \u041a\u043e\u0434 <code>Sequence<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">class Sequence implements Iterator&lt;T&gt;, SequenceScope&lt;T&gt;, Iterable&lt;T&gt; {     private static final Object STOP = new Object();     private Object next = STOP;     private Continuation&lt;T&gt; nextStep;      public Sequence(Continuation&lt;T&gt; nextStep) {         this.nextStep = nextStep;     }      @Override     public boolean hasNext() {         if (next == STOP) {             nextStep.run(this);         }         return next != STOP;     }      @Override     public T next() {         if (next == STOP) {             if (!hasNext()) {                 throw new NoSuchElementException();             }         }          T result = (T) next;         next = STOP;         return result;     }      @Override     void yield(T t) {         next = t;     }      public Iterator&lt;T&gt; iterator() { \/\/ \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f         return this;     }  }  interface SequenceScope&lt;T&gt; {     void yield(T t); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e java \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441 \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0412\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u043b\u0435 label, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0433\u043e yield.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">class IntegerSequenceContinuation implements Continuation&lt;Integer&gt; {     private int label = 0;     private int i = 0;     void run(SequenceScope&lt;Integer&gt; scope) {         int i = this.i;         switch (label) {             case 0:                 System.out.println(&quot;Continuation start&quot;);                 scope.yield(i++);                 label = 1;                 this.i = i;                 return;             case 1:                 System.out.println(&quot;Continuation resume&quot;);                 scope.yield(i++);                 label = 2;                 this.i = i;                 return;             case 2:                 System.out.println(&quot;Continuation resume&quot;);                 scope.yield(i++);                 label = 3;                 this.i = i;                 return;             case 3:                 System.out.println(&quot;Continuation end&quot;);                 label = 4;             default:                 throw new RuntimeException();         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c state machine (\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442), \u0438 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0435\u0442\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0442\u043b\u0438\u043d \u0432 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445 (\u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0439\u043c\u0435\u0442\u0435). \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 4 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>run<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e i \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430. \u041a\u0440\u043e\u043c\u0435 \u043d\u0435\u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 scope \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 run. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b, \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 scope \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f \u043d\u0430 java \u0443 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0441\u043b\u043e\u0436\u043d\u043e, \u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"suspendable--continuation\">Suspendable &amp; Continuation<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430 \u043b\u0438 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430? \u041f\u0443\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>run<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>SUSPEND<\/code> \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public interface Continuation&lt;T&gt; {     Object SUSPEND = new Object() {         @Override         public String toString() {             return &quot;[SUSPEND]&quot;;         }     };      T run(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u044f \u0443\u0431\u0440\u0430\u043b \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a \u0432\u044b\u0437\u043e\u0432\u0443, \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u2014 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0445. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432, \u043d\u0443\u0436\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>scope<\/code> (\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f <code>SequenceScope<\/code>, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448 <code>yield<\/code>). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0438 \u043f\u0440\u043e \u043a\u0430\u043a\u043e\u0439 <code>SUSPEND<\/code> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c. \u0412\u0432\u0435\u0434\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Suspendable<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public abstract class Suspendable&lt;C extends Scope&gt; {     abstract public void run(C scope); }  interface Scope {}<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441?<\/b><\/p>\n<div class=\"spoiler_text\">\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u044f\u043c\u0431\u0434\u044b \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0441 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0438\u0445 \u043f\u043e\u043b\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041d\u043e \u043b\u044f\u043c\u0431\u0434\u044b \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0435 \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441. \u0417\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u0434\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/432418\/\">\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p><code>Suspendable<\/code> \u044d\u0442\u043e <code>Continuation<\/code> \u0432 \u0434\u0438\u0437\u0430\u0439\u043d \u0442\u0430\u0439\u043c\u0435, a <code>Continuation<\/code> \u044d\u0442\u043e <code>Suspendable<\/code> \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 <code>Suspendable<\/code>, \u0430 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 <code>Continuation<\/code>. \u041e\u0434\u043d\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u0440\u043e \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>yield<\/code>, \u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0411\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>@Suspend<\/code>. \u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u0438 \u043a \u0441\u0430\u043c\u043e\u043c\u0443 <code>yield<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">public class SequenceScope&lt;T&gt; implements Scope {     @Suspend     public void yield(T t) {...} }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430\u0445. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 label. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <code>\u043f\u043e\u043b\u0435<\/code> label \u0440\u0430\u0432\u043d\u043e 0 \u2014 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435) \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>Continuation.run<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0432 \u043b\u044e\u0431\u043e\u0435 \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e). \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>return SUSPEND<\/code>. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f <code>return null<\/code> (\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>null<\/code>). \u0412\u044b\u0437\u043e\u0432 <code>Continuation.run<\/code> \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c <code>ContinuationEndException<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0438\u0448\u0435\u0442 \u043a\u043e\u0434 \u0432 <code>Suspendable<\/code>, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <code>Continuation<\/code>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0438, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u0448\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">Sequence&lt;Integer&gt; seq = new Sequence(new Suspendable() {...});<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f, \u0432\u0435\u0434\u044c \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 <code>Continuation&lt;T&gt; nextStep;<\/code>. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>Continuation<\/code> \u0438\u0437 <code>Suspendable<\/code> \u0432 \u043a\u043e\u0434\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>Magic<\/code>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/le\/hn\/sk\/lehnsk5dh-wi0l_awsdjm9ykz8m.jpeg\"><\/p>\n<p>  <\/p>\n<pre><code class=\"java\">package joroutine.core;  import joroutine.coroutine.CoroutineScopeImpl;  import java.lang.reflect.Field;  public class Magic {     public static final String SCOPE = &quot;scope$S&quot;;      private static &lt;C extends Scope, R&gt; Continuation&lt;R&gt; createContinuation(Suspendable&lt;C&gt; suspendable, C scope) {         try {             Field contextField = suspendable.getClass().getDeclaredField(SCOPE);             contextField.setAccessible(true);              if (contextField.get(suspendable) != null)                 throw new IllegalArgumentException(&quot;Continuation already created&quot;);              contextField.set(suspendable, scope);         } catch (Exception e) {             throw new RuntimeException(e);         }          return getContinuation(suspendable);     }      public static &lt;R, C extends Scope&gt; Continuation&lt;R&gt; getContinuation(Suspendable suspendable) {         if (getScope(suspendable) == null)             throw new RuntimeException(&quot;No continuation created for provided suspendable&quot;);         \/\/noinspection unchecked         return ((Continuation&lt;R&gt;) suspendable);     }      private static Scope getScope(Suspendable suspendable) {         try {             Field contextField = suspendable.getClass().getDeclaredField(SCOPE);             contextField.setAccessible(true);             return (Scope) contextField.get(suspendable);         } catch (Exception e) {             throw new RuntimeException(e);         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u0430 \u043c\u0430\u0433\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>scope<\/code> \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435 <code>scope$S<\/code> (\u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0443\u0436\u0435 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435). \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437 \u0432 <code>createContinuation<\/code>, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u044d\u043a\u0441\u0435\u043f\u0448\u043d\u0443. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u043a <code>Continuation<\/code>. \u0412\u043e\u043e\u0431\u0449\u0435 \u044f \u0432\u0430\u0441 \u043e\u0431\u043c\u0430\u043d\u0443\u043b, \u0432\u0441\u044f \u043c\u0430\u0433\u0438\u044f \u043d\u0435 \u0437\u0434\u0435\u0441\u044c. \u0420\u0430\u0437 \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 <code>Suspendable<\/code> \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>Continuation<\/code>. \u0418 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u044d\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h3 id=\"struktura-proekta\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u0442\u0440\u0435\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u041d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0439 API)<\/li>\n<li>\u0422\u0435\u0441\u0442\u044b (\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0438\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443)<\/li>\n<li>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 Suspendable -&gt; Continuation (\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 gradle \u0442\u0430\u0441\u043a\u0438 \u0432 gradle buildSrc)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 buildSrc, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0433\u0434\u0435-\u0442\u043e \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u043e \u043f\u043e\u043a\u0430 \u043d\u0430\u043c \u044d\u0442\u043e \u0438 \u043d\u0435 \u043d\u0430\u0434\u043e. \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0434\u043b \u043f\u043b\u0430\u0433\u0438\u043d, \u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 java agent (\u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/puniverse\/quasar\">Quasar<\/a>) \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">build.gradle<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">plugins {     id &quot;java&quot; }  group 'microutines' version '1.0-SNAPSHOT'  sourceCompatibility = 1.8  task processYield(type: microutine.ProcessSuspendableTask) {     classPath = compileJava.outputs.files + compileJava.classpath     inputs.files(compileJava.outputs.files) }  task processTestYield(type: microutine.ProcessSuspendableTask) {     classPath = compileJava.outputs.files + compileTestJava.classpath     inputs.files(compileTestJava.outputs.files) }  compileJava.finalizedBy(processYield) \/\/ \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 compileTestJava.finalizedBy(processTestYield)  repositories {     mavenCentral() }  dependencies {     testCompile group: 'junit', name: 'junit', version: '4.12'     compile group: 'junit', name: 'junit', version: '4.12' }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0435\u0439 <code>Suspendable<\/code> \u0432 <code>Continuation<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0433\u0440\u0430\u0434\u043b \u0442\u0430\u0441\u043a\u0430 ProcessSuspendableTask. \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 \u0433\u0440\u0430\u0434\u043b \u0442\u0430\u0441\u043a\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u043d\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441 <code>SuspendableConverter<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u043d\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442.<\/p>\n<p>  <\/p>\n<h3 id=\"generaciya-baytkoda\">\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OW2 ASM. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 SAX \u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 ClassReader, \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u043c\u0443 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432 \u0432\u0438\u0434\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0431\u0430\u0439\u0442\u043e\u0432, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>accept(ClassVisitor visitor)<\/code>. ClassReader \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0430 (<code>visitMethod<\/code>, <code>visitClass<\/code>, <code>visitInsn<\/code>). \u0412\u0438\u0437\u0438\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u0438 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u0443. \u041e\u0431\u044b\u0447\u043d\u043e, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u0438\u0437\u0438\u0442\u043e\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>ClassWriter<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f (\u0443 \u043d\u0430\u0441 \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430\u043a\u0430\u044f), \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443. \u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 asm \u2014 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <code>ClassNode<\/code>, \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 \u043d\u0430\u0434 \u043d\u0438\u043c. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043e\u0431\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>Suspendable<\/code> \u0432 <code>Continuation<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f 3 \u043a\u043b\u0430\u0441\u0441\u0430: <\/p>\n<p>  <\/p>\n<ul>\n<li><code>SuspendInfoCollector<\/code> \u2014 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>Suspendable.run<\/code>, \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0441\u0435\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 <code>@Suspend<\/code> \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/li>\n<li><code>SuspendableConverter<\/code> \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Suspendable.run<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>Continuation.run<\/code>.<\/li>\n<li><code>SuspendableMethodConverter<\/code> \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 <code>Suspendable.run<\/code>. \u0414\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u0435 <code>label<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u043c\u0435\u0442\u043e\u0434\u0430 <code>run<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">MethodNode method = classNode.methods.stream()         .filter(methodNode -&gt; methodNode.name.equals(&quot;run&quot;) &amp;&amp; (methodNode.access &amp; Opcodes.ACC_BRIDGE) == 0)         .findFirst()         .orElseThrow(() -&gt; new RuntimeException(&quot;Unable to find method to convert&quot;));<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>run<\/code>, \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0441 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c bridge (\u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0447\u0438\u0442\u0430\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/426419\/\">\u0437\u0434\u0435\u0441\u044c<\/a>). \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 JVM \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 (\u0438 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439) \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u043c\u0435\u0441\u0442\u043e. ASM \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e <code>Label<\/code> (\u043c\u0435\u0442\u043a\u0430), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435. \u041f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>@Suspend<\/code> \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u044b \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043a\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>run<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\"> @Override     public void visitCode() { \/\/ \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u0435\u0442\u043e\u0434\u0430         super.visitCode();          Label startLabel = new Label();          super.visitVarInsn(Opcodes.ALOAD, THIS_VAR_INDEX); \/\/ \u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u0441\u0442\u0435\u043a this         super.visitFieldInsn(Opcodes.GETFIELD, myClassJvmName, &quot;label$S$S&quot;, &quot;I&quot;);  \/\/\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043b\u0435 label$S$S         super.visitVarInsn(Opcodes.ISTORE, labelVarIndex); \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e          super.visitVarInsn(Opcodes.ILOAD, labelVarIndex); \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e label \u0432 \u0441\u0442\u0435\u043a         super.visitIntInsn(Opcodes.BIPUSH, 0); \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c 0 \u0432 \u0441\u0442\u0435\u043a         super.visitJumpInsn(Opcodes.IF_ICMPEQ, startLabel); \/\/ \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043c\u0435\u0442\u043a\u0435 startLabel \u0435\u0441\u043b\u0438 \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0435\u043a\u0435 \u0440\u0430\u0432\u043d\u044b (label == 0)          for (int i = 0; i &lt; numLabels; i++) { \/\/ \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u043a             super.visitVarInsn(Opcodes.ILOAD, labelVarIndex);             super.visitIntInsn(Opcodes.BIPUSH, i + 1);             super.visitJumpInsn(Opcodes.IF_ICMPEQ, labels[i]);         }          super.visitTypeInsn(Opcodes.NEW, &quot;microutine\/core\/ContinuationEndException&quot;); \/\/ run \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438, \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u044d\u043a\u0441\u0435\u043f\u0448\u043d         super.visitInsn(Opcodes.DUP);         super.visitMethodInsn(Opcodes.INVOKESPECIAL, &quot;microutine\/core\/ContinuationEndException&quot;, &quot;&lt;init&gt;&quot;, &quot;()V&quot;, false);         super.visitInsn(Opcodes.ATHROW);          super.visitLabel(startLabel); \/\/ \u043c\u0435\u0442\u043a\u0430, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434      }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>@Suspend<\/code> \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">@Override public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {     boolean suspendPoint = Utils.isSuspendPoint(classLoader, owner, name);      super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);     if (suspendPoint) {         super.visitVarInsn(Opcodes.ALOAD, THIS_VAR_INDEX); \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u0441\u0442\u0435\u043a this         super.visitIntInsn(Opcodes.BIPUSH, suspensionNumber); \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u043c\u0435\u0442\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437         super.visitFieldInsn(Opcodes.PUTFIELD, myClassJvmName, &quot;label$S$S&quot;, &quot;I&quot;); \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043c \u0435\u0435 \u0432 \u043f\u043e\u043b\u0435 label$S$S          saveFrame(); \/\/ \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435          suspend();          super.visitLabel(labels[suspensionNumber - 1]); \/\/ \u043c\u0435\u0442\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f          restoreFrame(); \/\/ \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435         suspensionNumber++;     } }  private void suspend() {     super.visitFieldInsn(Opcodes.GETSTATIC, &quot;microutine\/core\/Continuation&quot;, &quot;SUSPEND&quot;, &quot;Ljava\/lang\/Object;&quot;); \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u0441\u0442\u0435\u043a Continuation.SUSPEND     super.visitInsn(Opcodes.ARETURN); \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"testy\">\u0422\u0435\u0441\u0442\u044b<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0434\u0430\u0435\u0442 \u043f\u043e\u0434\u0440\u044f\u0434 \u0442\u0440\u0438 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">testIntSequence<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class YieldTest {     @Test     public void testIntSequence() {         Sequence&lt;Integer&gt; sequence = new Sequence&lt;Integer&gt;(new SequenceSuspendable&lt;Integer&gt;() {             @Override             public void run(SequenceScope&lt;Integer&gt; scope) {                 scope.yield(10);                 scope.yield(20);                 scope.yield(30);             }         });          List&lt;Integer&gt; list = new ArrayList&lt;&gt;();         for (Integer integer : sequence) {             list.add(integer);         }          assertEquals(10, (int) list.get(0));         assertEquals(20, (int) list.get(1));         assertEquals(30, (int) list.get(2));     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0421\u0430\u043c \u0442\u0435\u0441\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u0437\u0430\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0442\u044c class \u0444\u0430\u0439\u043b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">testIntSequence decompiled<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class YieldTest {     public YieldTest() {     }      @Test     public void testIntSequence() {         class NamelessClass_1 extends SequenceSuspendable&lt;Integer&gt; implements Continuation {             private SequenceScope scope$S;              NamelessClass_1() {             }              public Object run(Object var1) {                 int label = this.label$S$S;                 SequenceScope var2;                 if (label != 0) {                     if (label != 1) {                         if (label != 2) {                             if (label != 3) {                                 throw new ContinuationEndException();                             } else {                                 var2 = this.scope$S;                                 this.label$S$S = 4;                                 return null;                             }                         } else {                             var2 = this.scope$S;                             this.yield(30);                             this.label$S$S = 3;                             this.scope$S = var2;                             return Continuation.SUSPEND;                         }                     } else {                         var2 = this.scope$S;                         this.yield(20);                         this.label$S$S = 2;                         this.scope$S = var2;                         return Continuation.SUSPEND;                     }                 } else {                     var2 = this.scope$S;                     this.yield(10);                     this.label$S$S = 1;                     this.scope$S = var2;                     return Continuation.SUSPEND;                 }             }         }          Sequence&lt;Integer&gt; sequence = new Sequence(new NamelessClass_1());         List&lt;Integer&gt; list = new ArrayList();         Iterator var3 = sequence.iterator();          while(var3.hasNext()) {             Integer integer = (Integer)var3.next();             list.add(integer);         }          Assert.assertEquals(10L, (long)(Integer)list.get(0));         Assert.assertEquals(20L, (long)(Integer)list.get(1));         Assert.assertEquals(30L, (long)(Integer)list.get(2));     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041a\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0434\u0443\u043b\u0441\u044f, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u2014 \u044d\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u043e\u0432\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445). \u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0438 \u0431\u0435\u0437 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">fibonacci<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class YieldTest {     @Test     public void fibonacci() {         Sequence&lt;Integer&gt; sequence = new Sequence&lt;&gt;(new Suspendable&lt;Integer&gt;() {             @Override             public void run(SequenceScope&lt;Integer&gt; scope) {                 scope.yield(1);                 scope.yield(1);                  int a = 1;                 int b = 1;                  while (true) {                     b += a;                     scope.yield(b);                     a += b;                     scope.yield(a);                 }             }         });          \/\/noinspection OptionalGetWithoutIsPresent         Integer tenthFibonacci = StreamSupport.stream(sequence.spliterator(), false)                 .skip(9).findFirst().get();          assertEquals(55, ((int) tenthFibonacci));     } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c:<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">fibonacci decompiled<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">public class YieldTest {     public YieldTest() {     }       @Test      public void fibonacci() {          class NamelessClass_1 extends SequenceSuspendable&lt;Integer&gt; implements Continuation {              private SequenceScope scope$S;              private int aa$S;              private int ba$S;               NamelessClass_1() {              }               public Object run(Object var1) {                  int label = this.label$S$S;                  SequenceScope var2;                  if (label != 0) {                      if (label != 1) {                          int var3;                          int var4;                          if (label != 2) {                              if (label == 3) {                                  var2 = this.scope$S;                                  var3 = this.aa$S;                                  var4 = this.ba$S;                                  var3 += var4;                                  var2.yield(var3);                                  this.label$S$S = 4;                                  this.scope$S = var2;                                  this.aa$S = var3;                                  this.ba$S = var4;                                  return Continuation.SUSPEND;                              }                               if (label != 4) {                                  throw new ContinuationEndException();                              }                               var2 = this.scope$S;                              var3 = this.aa$S;                              var4 = this.ba$S;                          } else {                              var2 = this.scope$S;                              var3 = 1;                              var4 = 1;                          }                           var4 += var3;                          var2.yield(var4);                          this.label$S$S = 3;                          this.scope$S = var2;                          this.aa$S = var3;                          this.ba$S = var4;                          return Continuation.SUSPEND;                      } else {                          var2 = this.scope$S;                          var2.yield(1);                          this.label$S$S = 2;                          this.scope$S = var2;                          return Continuation.SUSPEND;                      }                  } else {                      var2 = this.scope$S;                      var2.yield(1);                      this.label$S$S = 1;                      this.scope$S = var2;                      return Continuation.SUSPEND;                  }              }          }           Sequence&lt;Integer&gt; sequence = new Sequence(new NamelessClass_1());          Integer tenthFibonacci = (Integer)StreamSupport.stream(sequence.spliterator(), false).skip(9L).findFirst().get();          Assert.assertEquals(55L, (long)tenthFibonacci);      } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e. \u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0433\u043e\u043d\u044f\u044e\u0442 \u0442\u0443\u0434\u0430 \u0441\u044e\u0434\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0439 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0442\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 while, \u0445\u043e\u0442\u044f \u043e\u043d \u0435\u0441\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u041d\u0438\u0447\u0435\u0433\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442. \u0422\u0435\u043b\u043e \u0446\u0438\u043a\u043b\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u043b\u0430 \u0446\u0438\u043a\u043b\u0430 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u043e\u044f\u0442\u044c \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u043a\u043e\u0434\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f, \u043d\u043e \u0443 \u043d\u0430\u0441 \u043e\u043d\u043e &#8216;\u0440\u0430\u0437\u0431\u0438\u0442\u043e&#8217; \u0434\u0432\u0443\u043c\u044f <code>return SUSPEND<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"rezyume\">\u0420\u0435\u0437\u044e\u043c\u0435<\/h3>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u0445\u043e\u0440\u043e\u0448\u043e. \u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0447\u0435\u0440\u0435\u0437 yield. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0444\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438, \u043d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u0435\u043d, \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u0435\u043d \u0438 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u044f \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0435\u0435 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f) \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0440\u0430\u0437\u043e\u0433\u0440\u0435\u0442\u044b\u0439 JIT \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0430\u043c \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u044f. \u041a\u0440\u043e\u043c\u0435 <code>yield<\/code> \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b <code>yieldAll<\/code> \u2014 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u043d\u043e \u044f \u043d\u0435 \u0441\u0442\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442 \u0434\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0438 \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0441\u0435\u0433\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0432\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0442\u043e \u0432\u044b \u0431\u0435\u0437 \u0442\u0440\u0443\u0434\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u0442\u0435\u0441\u044c \u0441\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431.<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0438 \u2014 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430, \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0430\u0445\u0430\u0440\u043e\u043c. \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u043e\u043d\u0442\u0438\u043d\u0443\u0430\u0446\u0438\u0439 \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0434\u0435\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435, \u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0443\u0436\u0435 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f\u0441\u043d\u0430 \u0441\u0432\u044f\u0437\u044c \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432: \u0438 \u0442\u0430\u043c \u0438 \u0442\u0430\u043c \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/480888\/\"> https:\/\/habr.com\/ru\/company\/haulmont\/blog\/480888\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/480888\/\">\n<p>\u0412 \u043c\u0438\u0440\u0435 JVM \u043f\u0440\u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0437\u043d\u0430\u044e\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044f\u0437\u044b\u043a\u0443 Kotlin \u0438 <a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/422519\/\">Project Loom<\/a>. \u0425\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043b\u0438\u043d\u043e\u0432\u0441\u043a\u0438\u0445 \u043a\u043e\u0440\u0443\u0442\u0438\u043d \u044f \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u0430 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 kotlin-coroutines \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u0437\u043d\u0430\u0435\u0442 \u043e \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e &quot;\u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438&quot;, \u0438 \u0447\u0442\u043e \u0432 \u043a\u043e\u0442\u043b\u0438\u043d\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0443\u043c\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430. \u0422\u0430\u043a\u0438\u043c \u0431\u044b\u043b \u0438 \u044f \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0418 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u0438\u0434\u0435\u044f, \u0447\u0442\u043e \u0440\u0430\u0437 \u043a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 java. \u0418\u0437 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438, \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2_\/7f\/s4\/2_7fs4po74_uoaqwmucjmnyjcuw.jpeg\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-297456","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=297456"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/297456\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=297456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=297456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=297456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}