{"id":364400,"date":"2024-05-21T02:16:12","date_gmt":"2024-05-21T02:16:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=364400"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=364400","title":{"rendered":"<span>CompletableFuture. \u0413\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u0435<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><code>java.util.concurrent.CompletableFuture<\/code> &#8212; \u043a\u043b\u0430\u0441\u0441 \u043d\u0435 \u043d\u043e\u0432\u044b\u0439. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u043b \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u043e \u0432\u0441\u0451\u043c \u0441\u0432\u043e\u0451\u043c \u0432\u0435\u043b\u0438\u0447\u0438\u0438 \u0432 2014-\u043c \u0433\u043e\u0434\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c Java 8. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u0440\u043e\u0448\u043b\u043e, \u0430 \u043f\u0440\u043e\u0449\u0435 \u043e\u043d \u043d\u0435 \u0441\u0442\u0430\u043b.<\/p>\n<p>\u041c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0445 &#171;\u0444\u044c\u044e\u0447\u0438&#187;. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0447\u0430\u0441\u0442\u044f\u043c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<\/p>\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h2>\n<ol>\n<li>\n<p><a href=\"#intro\" rel=\"noopener noreferrer nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#inside\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#complete\" rel=\"noopener noreferrer nofollow\">\u041a\u0442\u043e \u0438 \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#compose\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#thread\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#order\" rel=\"noopener noreferrer nofollow\">\u0412 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#wait\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b get\/join<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#exceptions\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#anyof\" rel=\"noopener noreferrer nofollow\">anyOf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#allof\" rel=\"noopener noreferrer nofollow\">allOf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#whymrlea\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0414\u0430\u0433\u0430 \u041b\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#final\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"intro\" id=\"intro\"><\/a><\/p>\n<h2>1. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p><code>CompletableFuture<\/code> &#8212; \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Future<\/code> (&#171;\u0441\u0442\u0430\u0440\u044b\u0439&#187;), \u0442\u0430\u043a \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>CompletionStage<\/code> (&#171;\u043d\u043e\u0432\u044b\u0439&#187;). \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0447\u0430\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u041c\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c javadoc, \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u044f \u0432\u0441\u0451 \u0436\u0435 \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0421\u044e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e).<br \/>\u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>get*<\/code> \u0438 <code>join<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<br \/>\u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>complete*<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>CompletableFuture<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>then*<\/code>, <code>when*<\/code>, <code>handle*<\/code> \u0438 \u0442.\u0434. \u041c\u043d\u043e\u0433\u043e \u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0447\u0438\u0435 \u043c\u0435\u043b\u043e\u0447\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434. \u0412 \u043d\u0451\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0441\u0430\u043c\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<pre><code class=\"java\">\/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. CompletableFuture&lt;Void> asyncOp = CompletableFuture.runAsync(     () -> doAsyncOperation() );  \/\/ \u041f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u0435\u0449\u0451. doSomethingElse();  \/\/ \u0410 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. asyncOp.join();<\/code><\/pre>\n<p>\u0424\u044c\u044e\u0447\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>*Task<\/code>, \u043d\u0435\u0442 \u044f\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0417\u0430 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u0430\u043c \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p><a class=\"anchor\" name=\"inside\" id=\"inside\"><\/a><\/p>\n<h2>2. \u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438<\/h2>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0430\u0451\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 (\u0432 \u043d\u0451\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 API), \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043e\u043d \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"java\">volatile Object result;       \/\/ Either the result or boxed AltResult volatile Completion stack;    \/\/ Top of Treiber stack of dependent actions<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u043b\u0435 <code>result<\/code> \u0440\u0430\u0432\u043d\u043e <code>null<\/code>. \u0414\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>NIL<\/code> &#8212; \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0432\u0435\u043d <code>null<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0430\u043d\u0441 <code>java.util.concurrent.CompletableFuture.AltResult<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u0435\u043a\u0442-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u043d\u0438 \u0432 \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0442.\u0435. \u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 \u0432\u0440\u043e\u0434\u0435 <code>cancelled<\/code> \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u0424\u044c\u044e\u0447\u0430, \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>cancel<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>AltResult<\/code> \u0441 <code>CancellationException<\/code>. \u0422.\u0435. \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f <code>result<\/code> \u0440\u043e\u0432\u043d\u043e 3.<\/p>\n<p>\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <code>null<\/code> \/ \u043d\u0435 <code>null<\/code> &#8212; \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0444\u044c\u044e\u0447\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041c\u0435\u0442\u043e\u0434 <code>isDone<\/code> \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 <code>isCompletedExceptionally<\/code>, \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c <code>AltResult<\/code> \u0438 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d <code>NIL<\/code> (<code>NIL<\/code> \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0440\u0430\u0432\u0435\u043d <code>new AltResult(null)<\/code>). <code>isCancelled<\/code> \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p><code>stack<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0444\u044c\u044e\u0447\u0438. \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p><a class=\"anchor\" name=\"complete\" id=\"complete\"><\/a><\/p>\n<h2>3. \u041a\u0442\u043e \u0438 \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0438<\/h2>\n<p>\u0424\u044c\u044e\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u043f\u0440\u0438\u0447\u0438\u043d. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>complete<\/code> \/ <code>completeExceptionally<\/code> \/ <code>cancel<\/code>.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043a\u043e\u0434, \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f <code>Runnable<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>CompletableFuture#runAsync<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0447\u0435\u043d\u0430 <code>source<\/code> \u0444\u044c\u044e\u0447\u0430. \u0412 API <code>CompletionStage<\/code> \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> source = giveMeTheFuture();  CompletableFuture&lt;Object> dependent = source.thenApply(this::transformResult);<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>thenApply<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0430\u044f \u0441\u0432\u044f\u0437\u044c. \u041e\u0431\u044a\u0435\u043a\u0442 <code>source<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <code>dependent<\/code> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0451\u043c (\u043d\u0430 \u043d\u0438\u0445) <code>complete<\/code> \/ <code>completeExceptionaly<\/code> \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0447\u0435\u0442\u044b\u0440\u0435 &#8212; \u0442\u0430\u0439\u043c\u0430\u0443\u0442. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0444\u044c\u044e\u0447\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <code>orTimeout<\/code> \/ <code>completeOnTimeout<\/code> \u0438 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u043e \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u043c\u0435\u043d\u043e\u0439 (\u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>cancel<\/code>), \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 <code>completeOnTimeout<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442 <em>\u0442\u0435\u043a\u0443\u0449\u0443\u044e<\/em> \u0444\u044c\u044e\u0447\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0443, \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 <code>RESULT.compareAndSet(this, null, res);<\/code> (<code>RESULT<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 <code>VarHandle<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>result<\/code>, \u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CompletableFuture<\/code>).<\/p>\n<p>\u0427\u0435\u043c \u0445\u043e\u0440\u043e\u0448 \u0434\u0430\u043d\u043d\u044b\u0439 <code>compareAndSet<\/code> \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 <code>result<\/code> \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441 <code>null<\/code> \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041c\u0435\u0442\u043e\u0434\u044b <code>complete*<\/code> \/ <code>cancel<\/code> \u043a\u0430\u043a \u0440\u0430\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e\u0433\u043e CAS-\u0430. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0433\u043e\u043d\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u043e\u0433\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u0443\u0442 \u0432\u0441\u0451 \u0447\u0435\u0441\u0442\u043d\u043e. \u041a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439, \u0442\u043e\u0442 \u0438 \u0432\u044b\u0438\u0433\u0440\u0430\u043b.<br \/>\u0415\u0441\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>obtrude*<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0442\u0435\u0440\u0435\u0442\u044c <code>result<\/code>, \u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e, \u043d\u0430\u0441\u0442\u0430\u0451\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0444\u044c\u044e\u0447\u0430\u043c\u0438 (\u043a\u0430\u043a-\u0442\u043e \u043b\u0435\u0436\u0430\u0449\u0438\u043c\u0438 \u0432 \u043f\u043e\u043b\u0435 <code>stack<\/code>) \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u0445.<\/p>\n<p><a class=\"anchor\" name=\"compose\" id=\"compose\"><\/a><\/p>\n<h2>4. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/h2>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435, \u0432\u0441\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u044c\u044e\u0447\u0435\u0439.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>B<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>A<\/code> &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 &#8212; \u043d\u043e\u0432\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>C<\/code> \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0431\u0435 <code>A<\/code> \u0438 <code>B<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b, \u0438\u043b\u0438 \u0436\u0435 \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <code>A<\/code> \u0438 <code>B<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0438 \u0442.\u0434.<\/p>\n<p>\u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u0443\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445.<\/p>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u044c\u044e\u0447\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044f <code>stack<\/code>. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0441\u0442\u0435\u043a, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0430 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Treiber_stack\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/a>. \u0412\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 <code>CompletableFuture<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 CAS-\u0430\u0445 \u0438 \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0433\u043e\u043d\u043a\u0430\u043c, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043b\u043e\u043a\u043e\u0432 \u0442\u0430\u043c \u043d\u0435\u0442. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044f <code>stack<\/code> \u0443 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438. \u0412 \u0433\u043e\u043b\u043e\u0432\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0438\u043f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>dependent<\/code> \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b &#8212; <code>thenApply(Function&lt;...> fn)<\/code>. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 <code>CompletableFuture<\/code> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Functor_(functional_programming)\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c<\/a>, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fn<\/code>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438. \u041e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>thenApply<\/code> \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;V> d = newIncompleteFuture(); unipush(new UniApply&lt;T,V>(e, d, this, f)); return d;<\/code><\/pre>\n<p>\u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>Completion<\/code> \u0432 \u0441\u0442\u0435\u043a \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c. \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 <code>Completion<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043a\u0430\u043a <code>source<\/code> (<code>this<\/code>), \u0442\u0430\u043a \u0438 \u043d\u0430 <code>dependent<\/code> (<code>d<\/code>) \u0444\u044c\u044e\u0447\u0438, \u043d\u0443 \u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>f<\/code> \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435. <code>e<\/code> &#8212; \u044d\u0442\u043e <code>Executor<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>f<\/code>, \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c <code>source<\/code> \u0444\u044c\u044e\u0447\u0443, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0435\u0451 \u043f\u043e\u043b\u044f <code>stack<\/code> (\u0441 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f) \u0438 \u0432\u044b\u0437\u043e\u0432 <code>Completion#tryFire<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445. \u0414\u043b\u044f <code>UniApply<\/code> \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">final CompletableFuture&lt;V> tryFire(int mode) {     CompletableFuture&lt;V> d; ...     Object r; ... Function&lt;? super T,? extends V> f;     ...         try {             ...                 @SuppressWarnings(\"unchecked\") T t = (T) r;                 d.completeValue(f.apply(t));             ...         } catch (Throwable ex) {             d.completeThrowable(ex);         }     }     ... }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438 \u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>f<\/code>, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435, \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438 <code>d<\/code>. \u0426\u0438\u043a\u043b \u0437\u0430\u043c\u043a\u043d\u0443\u043b\u0441\u044f.<\/p>\n<p><a class=\"anchor\" name=\"thread\" id=\"thread\"><\/a><\/p>\n<h2>5. \u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434<\/h2>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 &#8212; \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u0432\u0430\u0441 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u0435\u0431\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438.<\/p>\n<p>\u041a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443? \u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 <code>accept*<\/code>\/<code>run*<\/code>\/<code>then*<\/code>\/<code>handle*<\/code>\/<code>when*<\/code> \u0438 \u0442.\u0434. \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Function<\/code> \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u043d\u0435\u0435. \u0413\u0434\u0435 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c <code>Async<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>thenApplyAsync<\/code>, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 executor-\u0435. \u0415\u0441\u043b\u0438 executor \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 <code>CompletableFuture#defaultExecutor<\/code>. \u041e\u043d, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u043e\u0432\u043f\u0430\u0434\u0451\u0442 \u0441 <code>ForkJoinPool.commonPool<\/code> (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438).<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">\/\/ \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434: fut.thenApplyAsync(res -> foo(res), e);  \/\/ \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u043e\u0442: fut.thenCompose(res -> CompletableFuture.runAsync(() -> foo(res), e));<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u0443\u0436\u0435 \u043e \u043d\u0435 <code>Async<\/code> \u043c\u0435\u0442\u043e\u0434\u0430\u0445. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u0444\u044c\u044e\u0447\u0451\u0439, \u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0442.\u0435. \u0441\u0440\u0430\u0437\u0443 \u0436\u0435. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430 &#8212; \u0440\u0430\u0437 \u0444\u044c\u044e\u0447\u0430 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u0434\u0440\u0443\u0433 \u043d\u0430\u0447\u043d\u0451\u0442 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 <code>stack<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0443 \u043d\u0430\u0441 \u043c\u0430\u043b\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0437\u0430 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0444\u044c\u044e\u0447\u0435 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d <code>onTimeout<\/code>, \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0448\u043b\u043e, \u0442\u043e \u0432\u0430\u0448\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>CompletableFutureDelayScheduler<\/code> (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0432\u043e\u043e\u0431\u0449\u0435). \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>CompletableFuture<\/code> \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c \u0441 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<br \/>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u0432\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0441\u0434\u0435\u043b\u0430\u0432 \u0435\u0433\u043e \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 <code>complete*<\/code>, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u044c\u044e\u0447\u0438, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e \u0440\u0430\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 <code>complete*<\/code> \u0432\u044b\u0437\u0432\u0430\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430\u0447\u043d\u0443\u0442 \u0440\u0430\u0437\u043c\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435 <code>stack<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0432 \u043d\u0451\u043c.<\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043c\u0435\u0442\u043e\u0434\u0443 <code>onTimeout<\/code>. \u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0438 delayed scheduler, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0444\u044c\u044e\u0447\u0443 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f? \u0410 \u0442\u043e, \u0447\u0442\u043e <code>CompletableFutureDelayScheduler<\/code> \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <code>TimeoutException<\/code> \u043d\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f!<br \/>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044f \u043e\u0448\u0438\u0431\u0430\u044e\u0441\u044c, \u0432\u0435\u0434\u044c \u0432 \u043a\u043e\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CompletableFuture.Timeout<\/code> \u0435\u0441\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0430. \u041d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>completeExceptionally<\/code> \u0444\u044c\u044e\u0447\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">if (f != null &amp;&amp; !f.isDone())     \/\/ \u0412\u043e\u0442 \u0442\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043b\u043e\u0445\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0433\u043e\u043d\u043a\u0438.     f.completeExceptionally(new TimeoutException());<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b <code>onTimeout<\/code>. \u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 (\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a &#8212; <code>main<\/code>)?<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> f = new CompletableFuture&lt;>(); f.whenComplete((res, throwable) ->     System.out.println(res + \" \" + Thread.currentThread().getName()) );  f.orTimeout(100, TimeUnit.MILLISECONDS);  Thread.sleep(100); f.complete(\"Result\");<\/code><\/pre>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b 4 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u0438\u043a\u0430:<br \/>1. <code>Result main<\/code><br \/>2. <code>null CompletableFutureDelayScheduler<\/code><br \/>3. <code>Result CompletableFutureDelayScheduler<\/code><br \/>4. <code>null main<\/code><\/p>\n<p>\u0410 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435? \u0415\u0441\u043b\u0438 \u0432\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0432\u0441\u0435 4 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430.<\/p>\n<p>\u0412 \u043a\u0430\u043a\u0438\u0445 \u0435\u0449\u0451 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434? \u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0438\u0439 <code>get<\/code> \u0438\u043b\u0438 <code>join<\/code>, \u0442\u043e\u0436\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0435\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0436\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0444\u044c\u044e\u0447\u0430 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430). \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0435 \u043f\u043e\u0442\u043e\u043a, \u043d\u043e \u0435\u0449\u0451 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430 \u043d\u0451\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u043a\u043e\u0434, \u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0433\u043b\u0438 \u0438 \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f.<br \/>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0440\u043e\u0434\u0435 <code>if (fut.isDone())<\/code> \u0441\u043c\u043e\u0436\u0435\u0442 \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 <code>else<\/code> \u0432\u0435\u0442\u043a\u0435. \u041a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c <code>*Async<\/code> \u0432\u044b\u0437\u043e\u0432?<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u044b\u0445\u043e\u0434. \u0415\u0441\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e <code>fut.get()<\/code> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>fut.thenApply(Function.identity()).get()<\/code>, \u0442\u043e \u0443 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 <code>get<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439. \u041c\u044b \u0442\u043e\u0447\u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0437\u043d\u0430\u0435\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0438 \u0443 \u043a\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0443. \u0415\u0433\u043e \u043f\u043e\u043b\u0435 <code>stack<\/code> \u043f\u0443\u0441\u0442\u043e\u0435, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u0435\u0432\u044b\u0439 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d, \u0442\u0430\u043a \u0432\u0435\u0434\u044c?<\/p>\n<p>\u041d\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043d\u0435 \u0442\u0430\u043a, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e! \u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0432\u0435\u0440\u043d\u044b \u043b\u0438 \u043e\u043d\u0438. \u0427\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0441 <code>get<\/code> \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432\u0441\u0451 \u0447\u0438\u0441\u0442\u043e (<code>stack<\/code> \u0442\u043e \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 <code>null<\/code>) \u0438 \u043c\u0430\u043b\u0438\u043d\u0443 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u0440\u0442\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u0437\u043e\u0432 <code>thenApply<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0443\u043d\u043a\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u0442.\u0435. \u0432\u044b\u0437\u043e\u0432 <code>fut.then*<\/code>, <code>fut.when*<\/code>, <code>fut.handle*<\/code> \u0438 \u0442.\u0434. \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0438\u0442 <code>fut<\/code>. \u0412\u0430\u043c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0435\u0437\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0442\u0430\u043a\u0443\u044e \u0433\u043e\u043d\u043a\u0443, \u043d\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438 \u044d\u0442\u043e \u043d\u0435 \u0431\u0430\u0433. \u041a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<\/p>\n<ul>\n<li>\n<p><code>thenApply<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f <code>result<\/code>, \u043e\u043d\u043e \u0440\u0430\u0432\u043d\u043e <code>null<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>thenApply<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>UniApply<\/code> \u0432 <code>stack<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0430\u043b\u0435\u0435 <code>thenApply<\/code> \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>result<\/code> \u0438 \u043e\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 <code>null<\/code>. \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0437\u0440\u044f \u043c\u0435\u043d\u044f\u043b\u0438 <code>stack<\/code> \u0438 \u0447\u0442\u043e \u043d\u0430\u0448 <code>UniApply<\/code> \u043d\u0438\u043a\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>complete<\/code> \u043c\u043e\u0433 \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443).<br \/>\u041c\u044b \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0433\u043e\u043d\u043a\u0438 \u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0448 <code>UniApply<\/code>, \u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u044d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#8212; \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0418\u0442\u043e\u0433\u043e &#8212; \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u043e\u0431\u0435\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0442\u0430\u043c \u043d\u0430\u0439\u0434\u0451\u043c (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 <code>UniApply<\/code>), \u043a\u0430\u043a \u043c\u044b \u0431\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>get<\/code> \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0447\u0438\u0441\u043b\u0435 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u044c\u044f-\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430, \u043a\u043e\u0434 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u043e\u0432<code>.thenApply(Function.identity())<\/code> \u0441\u0434\u0435\u043b\u0430\u0442\u044c <em>\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e<\/em> \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0444\u044c\u044e\u0447\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0447\u0435\u043d\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0440\u0438\u0441\u043a \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0442\u0440\u0435\u0448\u0430.<\/p>\n<p><a class=\"anchor\" name=\"order\" id=\"order\"><\/a><\/p>\n<h2>6. \u0412 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0427\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f?<\/p>\n<p>\u042f\u0441\u043d\u043e \u043e\u0434\u043d\u043e &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0434\u0438\u043a\u0442\u0443\u0435\u043c\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u0442\u0443\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> f = new CompletableFuture&lt;>();  f.whenComplete((o, throwable) -> System.out.println(\"Closure 1\")); f.whenComplete((o, throwable) -> System.out.println(\"Closure 2\"));  f.complete(\"Result\");<\/code><\/pre>\n<p>\u0412 \u0442\u0435\u043e\u0440\u0438\u0438, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u043c\u0435\u0436\u0434\u0443 3-\u043c\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434\u0430:<br \/>1. <code>Closure 1<\/code>, \u0437\u0430\u0442\u0435\u043c <code>Closure 2<\/code><br \/>2. <code>Closure 2<\/code>, \u0437\u0430\u0442\u0435\u043c <code>Closure 1<\/code><br \/>3. \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d<\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0447\u044c\u044f-\u0442\u0430 \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u044f \u0441\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 1. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 2. \u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0441\u0435\u0431\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 <code>CompletableFuture<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0435\u043a.<\/p>\n<pre><code class=\"java\">\/\/ stack: null CompletableFuture&lt;Object> fut = new CompletableFuture&lt;>();  \/\/ stack: UniWhenComplete(closure 1) -> null fut.whenComplete((o, throwable) -> System.out.println(\"Closure 1\"));  \/\/ stack: UniWhenComplete(closure 2) -> UniWhenComplete(closure 1) -> null fut.whenComplete((o, throwable) -> System.out.println(\"Closure 2\"));  \/\/ \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. fut.complete(\"Result\");<\/code><\/pre>\n<p>\u0421\u0442\u0435\u043a, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 LIFO (last in, first out). \u042d\u0442\u0438\u043c \u0438 \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u0439 \u0444\u044c\u044e\u0447\u0443 (\u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b. \u042d\u0442\u043e \u043d\u0435\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u043a\u043e\u0434, \u044f \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<pre><code class=\"java\">while (stack != null) {     Completion c = removeHead();      if (c == null) break;      executeCompletionOperation(c); }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \/ \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0442\u0435\u043a\u0430. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432\u0437\u044f\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u043b\u0438\u0441\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <code>orTimeout<\/code>, \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 <code>complete*<\/code> \u0438 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>get<\/code>\/<code>join<\/code> \u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0445 \u0444\u044c\u044e\u0447\u0430\u0445 \u0438 \u0442.\u0434., \u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f. \u0421\u0442\u0435\u043a \u0442\u0430\u043a \u0441\u0442\u0435\u043a, \u043f\u0443\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u044c, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u043d\u0442\u0443\u0438\u0446\u0438\u0438 &#8212; \u043e\u043f\u0430\u0441\u043d\u043e. \u0415\u0441\u043b\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u043e\u043d\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u043c \u0443\u0433\u043e\u0434\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u044d\u0442\u043e \u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u043e &#171;\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435&#187;. \u041f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 &#8212; \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u043e. \u041a\u043e\u043d\u0442\u0440\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> fut = new CompletableFuture&lt;>();  CompletableFuture&lt;Object> dep = fut.thenApply(Function.identity());  dep.whenComplete((o, throwable) -> System.out.println(\"Closure 1\")); dep.whenComplete((o, throwable) -> System.out.println(\"Closure 2\"));  fut.complete(\"Result\");  \/\/ \u0412\u044b\u0432\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439: \/\/ > Closure 1 \/\/ > Closure 2<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439. \u041d\u043e \u0432\u0435\u0434\u044c \u044d\u0442\u043e \u0441\u0442\u0435\u043a, \u043a\u0430\u043a, \u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0445\u0432\u043e\u0441\u0442\u0430? \u041a\u0430\u043a \u0436\u0435 LIFO?<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435 &#8212; \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435. \u0420\u0430\u0437\u0431\u043e\u0440\u043e\u043c \u0441\u0442\u0435\u043a\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043d\u0451\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>postComplete()<\/code>. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443 \u043d\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<pre><code class=\"java\">final void postComplete() {     \/*      * On each step, variable f holds current dependents to pop      * and run.  It is extended along only one path at a time,      * pushing others to avoid unbounded recursion.      *\/     CompletableFuture&lt;?> f = this; CompletableFuture.Completion h;     while ((h = f.stack) != null ||             (f != this &amp;&amp; (h = (f = this).stack) != null)) {         CompletableFuture&lt;?> d; CompletableFuture.Completion t;         if (STACK.compareAndSet(f, h, t = h.next)) {             if (t != null) {                 if (f != this) {                     pushStack(h);                     continue;                 }                 NEXT.compareAndSet(h, t, null); \/\/ try to detach             }             f = (d = h.tryFire(NESTED)) == null ? this : d;         }     } }<\/code><\/pre>\n<p>\u0410\u0432\u0442\u043e\u0440\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b. \u0421\u043b\u043e\u0436\u043d\u043e? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e. \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u044c\u044e\u0447\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0430\u043c \u0432\u0441\u0435\u0445 \u0435\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439. \u0418 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439. \u0418 \u0438\u0445&#8230;. \u043d\u043e \u043d\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>\u0410 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u044d\u0442\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Depth-first_search\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0438\u0441\u043a \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443<\/a>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u0435\u0440\u0435-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e \u0436\u0435 \u043f\u043e\u043b\u0435 <code>stack<\/code> \u0444\u044c\u044e\u0447\u0438 <code>source<\/code> (\u0442.\u0435. <code>this<\/code>). \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043a &#171;\u043c\u043e\u0436\u0435\u0442&#187; &#8212; \u043e\u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>pushStack<\/code>.<br \/><code>compareAndSet<\/code> \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u043c <code>\/\/ try to detach<\/code> \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b GC \u0438 \u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u0415\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0441\u043e\u0437\u0434\u0430\u0432 \u0444\u044c\u044e\u0447\u0443 <code>dep<\/code> \u043a\u0430\u043a<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> dep = fut         .thenApply(Function.identity())         .thenApply(Function.identity());<\/code><\/pre>\n<p>\u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0422\u0443\u0442 \u044f \u0443\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443.<\/p>\n<p><a class=\"anchor\" name=\"wait\" id=\"wait\"><\/a><\/p>\n<h2>7. \u0427\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b get\/join<\/h2>\n<p>\u041e\u043d\u0438 \u0436\u0434\u0443\u0442. \u0427\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u043e\u043a &#171;\u0436\u0434\u0451\u0442&#187;?<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>Unsafe#park<\/code> \/ <code>Unsafe#unpark<\/code>. \u0412 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0441\u043c\u044b\u0441\u043b\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">Thread thread = Thread.currentThread(); fut.whenComplete((res, throwable) -> LockSupport.unpark(thread));  LockSupport.park();  \/\/ \u0415\u0441\u0442\u044c \u0438 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434. Object res = fut.getNow(null);<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>get<\/code> \/ <code>join<\/code> \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435, \u043e\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 <code>stack<\/code> \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CompletableFuture.Signaller<\/code>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u0441\u0430\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0436\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430.<\/p>\n<p>\u0414\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u044b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <em>\u043d\u0435<\/em> \u0432 <code>ForkJoinPool<\/code>-\u0435. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0447\u044c\u0438-\u0442\u043e <code>ForkJoinTask<\/code>-\u0438 (\u0441\u043c. <code>ForkJoinPool#helpAsyncBlocker<\/code>). \u0415\u0441\u043b\u0438 \u044d\u0442\u0438 \u0442\u0430\u0441\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f. \u041f\u043e \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u0435\u0442\u043e\u0434 <code>get<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043b\u0438\u043c\u0438\u0442 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e\u0442 \u043b\u0438\u043c\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043d\u0430\u0440\u0432\u0451\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0442\u0430\u0441\u043a\u0443.<\/p>\n<p>\u0415\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442\u044c \u043b\u0438\u043c\u0438\u0442 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/21\/core\/virtual-threads.html\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438<\/a>. \u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u0434\u0435 \u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <code>Unsafe<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0412\u0441\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441\u0432\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0430\u0440\u043a\u043e\u0432\u043a\u0438, \u0438 \u043a\u043b\u0430\u0441\u0441 <code>LockSupport<\/code> \u0435\u0433\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442. \u041d\u0435 \u0431\u0443\u0434\u0443 \u043d\u0438\u043a\u043e\u0433\u043e \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u0442\u044c, \u044f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e. \u041d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435, \u0447\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0430\u0440\u043a\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u0434 \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e Java \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u043e \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0418 \u0432\u043e\u0442 \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f &#8212; \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0442.\u0435. \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0442\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 <code>ForkJoinPool<\/code>. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0440\u0430\u0437 \u044f \u043d\u0435 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u043c\u043e\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e <code>get<\/code> \/ <code>join<\/code> \u043c\u043e\u0433\u0443\u0442 \u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u044c\u044e\u0447\u0438, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p><a class=\"anchor\" name=\"exceptions\" id=\"exceptions\"><\/a><\/p>\n<h2>8. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0421 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>CompletableFuture<\/code> \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u044f\u0434 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><code>ExecutionException<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <code>get<\/code> \u0438 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code>Future<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>CancellationException<\/code> &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 <code>cancel<\/code>, <code>isCancelled<\/code> \u0438 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <code>State.CANCELLED<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>TimeoutException<\/code> &#8212; \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>orTimeout<\/code>. \u041e\u0441\u043e\u0431\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><code>CompletionException<\/code> &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>get<\/code> \u0434\u043b\u044f \u0444\u044c\u044e\u0447\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 <code>CancellationException<\/code>, \u0442\u043e <code>get<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>ExecutionException<\/code>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0432 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>CancellationException<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 <code>CompletionException<\/code> \u0438 \u0435\u0433\u043e <code>cause<\/code> \u0440\u0430\u0432\u0435\u043d <code>null<\/code>, \u0442\u043e <code>get<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>ExecutionException<\/code>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0432 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>CompletionException<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435, \u0435\u0441\u043b\u0438 \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 <code>CompletionException<\/code> \u0438 \u0435\u0433\u043e <code>cause<\/code> \u043d\u0435 \u0440\u0430\u0432\u0435\u043d <code>null<\/code>, \u0442\u043e <code>get<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>ExecutionException<\/code>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0432 \u0442\u043e\u0442 \u0436\u0435 <code>cause<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435, \u043a\u043e\u0433\u0434\u0430 \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c <code>e<\/code>, <code>get<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>ExecutionException<\/code> \u0441 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 <code>e<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e <code>CancellationException<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c.<code>join<\/code> \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 <code>CancellationException<\/code> \u0438\u043b\u0438 <code>CompletionException<\/code>, \u0442\u043e <code>join<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 \u0435\u0433\u043e \u0436\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0430\u0447\u0435 <code>join<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>CompletionException<\/code>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0432 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0444\u044c\u044e\u0447\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0438\u0442\u044c \u0444\u044c\u044e\u0447\u0443 \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c <code>var foo = new RuntimeException(\"Foo\")<\/code>, \u0442\u043e <code>join<\/code> \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 <code>new CompletionException(foo)<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0442\u0438\u0442\u044c \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c <code>new CompletionException(foo)<\/code>, \u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code>exceptionNow<\/code>, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0432\u0435\u0440\u043d\u0451\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>foo<\/code>. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e API \u043d\u0430\u0441 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043f\u0443\u0442\u0430\u0435\u0442 \u0438 \u043c\u0435\u0448\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b <code>CompletionException<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>join<\/code>.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043b\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 <code>completeExceptionaly<\/code>? \u0414\u0430, \u0435\u0441\u0442\u044c. \u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <s>\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0432\u043e\u0437\u0434\u044c<\/s> \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 <code>whenComplete*<\/code> \/ <code>handle*<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u0443 <code>CompletionException<\/code>-\u0430, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0448\u0451\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d. \u0412 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0438\u0449\u0435\u0442\u0435.<\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043b\u0438 \u043e\u0442\u043a\u0443\u0434\u0430-\u0442\u043e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043b\u044f\u043c\u0431\u0434\u044b \u0432 <code>whenComplete<\/code> \u0432\u0437\u044f\u0442\u044c\u0441\u044f <code>CompletionException<\/code>, \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c? \u0414\u0430, \u043c\u043e\u0436\u0435\u0442. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u044c\u044e\u0447\u0438 <em>\u0432\u0441\u0435\u0433\u0434\u0430<\/em> \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f \u0441 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c <code>CompletionException<\/code>, \u0435\u0441\u043b\u0438 \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u044c\u044e\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c, \u043b\u0438\u0431\u043e \u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0441\u0430\u043c\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (<code>Function<\/code> \/ <code>Consumer<\/code> \/ <code>BiFunction<\/code> \/ <code>BiConsumer<\/code> \/ &#8230;). \u041e\u0442\u0441\u044e\u0434\u0430 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435.<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> fut = new CompletableFuture&lt;>(); CompletableFuture&lt;Object> dep = fut.thenApply(Function.identity());  fut.cancel(false);  \/\/ > false System.out.println(dep.isCancelled());<\/code><\/pre>\n<p><code>cancel<\/code> \u043d\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0444\u044c\u044e\u0447\u0438, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439, \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 <code>CompletionException<\/code>.<\/p>\n<p><a class=\"anchor\" name=\"anyof\" id=\"anyof\"><\/a><\/p>\n<h2>9. anyOf<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 <code>CompletableFuture.Completion<\/code>, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0444\u044c\u044e\u0447\u0430\u043c\u0438, \u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439: <code>Uni*<\/code>, <code>Bi*<\/code> \u0438\u043b\u0438 <code>Or*<\/code>. \u0423 \u043f\u0435\u0440\u0432\u044b\u0445 &#8212; \u043e\u0434\u043d\u0430 <code>source<\/code> \u0444\u044c\u044e\u0447\u0430, \u0443 \u0432\u0442\u043e\u0440\u044b\u0445 \u0438 \u0442\u0440\u0435\u0442\u044c\u0438\u0445 &#8212; \u0434\u0432\u0435. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441 <code>AnyOf<\/code> \u0441\u0442\u043e\u0438\u0442 \u043e\u0441\u043e\u0431\u043d\u044f\u043a\u043e\u043c &#8212; \u0442\u0430\u043c \u0441\u0440\u0430\u0437\u0443 \u0446\u0435\u043b\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441 \u043d\u0438\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434 \u0438 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &#171;2 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438&#187;. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>fut.thenAcceptBoth(other, action)<\/code>. <code>other<\/code> &#8212; \u044d\u0442\u043e \u0434\u0440\u0443\u0433\u0430\u044f \u0444\u044c\u044e\u0447\u0430, \u0430 <code>action<\/code> &#8212; \u044d\u0442\u043e <code>java.util.function.BiConsumer<\/code> .<\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438 <code>fut<\/code>, \u0438 <code>other<\/code> \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b. \u0410 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a <code>fut<\/code>, \u0442\u0430\u043a \u0438 <code>other<\/code> (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f). \u0423 \u043d\u0438\u0445 \u043e\u0431\u043e\u0438\u0445 \u0432 \u043f\u043e\u043b\u0435 <code>stack<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f. \u041f\u0440\u0438\u0447\u0451\u043c \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Completion<\/code>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0437\u043b\u043e\u043c \u0441\u0442\u0435\u043a\u0430 (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f), \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0441\u0442\u0435\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0412\u044b\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 &#8212; \u0432 <code>fut.stack<\/code> \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c <code>c = new BiAccept(...)<\/code>, \u0430 \u0432 <code>other.stack<\/code> &#8212; <code>new CoCompletion(c)<\/code>. \u0412\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 &#8212; \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439. <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>thenAcceptBoth<\/code> \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>and<\/code>. \u041e\u0431\u0435 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0438 \u0447\u0438\u0441\u0442\u044f\u0442 \u0441\u0432\u043e\u0438 \u0441\u0442\u0435\u043a\u0438. \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u041d\u0435 \u0442\u0430\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 <code>or<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <code>anyOf<\/code>. \u0414\u043b\u044f \u043d\u0435\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 <code>source<\/code> \u0444\u044c\u044e\u0447\u0435\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f, \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041a\u0441\u0442\u0430\u0442\u0438, <code>CoCompletion<\/code> \u0434\u043b\u044f <code>AnyOf<\/code> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0427\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0432 <code>stack<\/code> \u0444\u044c\u044e\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f? \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0443\u0442\u0435\u0447\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u0438! \u041d\u043e \u043e\u0434\u043d\u043e \u0434\u0435\u043b\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 &#8212; \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0438 \u043d\u0435 \u0443\u0442\u0435\u0447\u043a\u0430, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0436\u0434\u0451\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0447\u0430\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442\u044c. \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>anyOf<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u043a\u043e\u0434 <code>AnyOf#tryFire<\/code>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0412\u0435\u0441\u044c \u0441\u0435\u043a\u0440\u0435\u0442 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 <code>CompletableFuture#cleanStack<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 <code>source<\/code> \u0444\u044c\u044e\u0447\u0430\u0445, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043d\u044f\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b <code>anyOf(a, b, c)<\/code> \u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u0444\u044c\u044e\u0447\u0443 <code>a<\/code>, \u0442\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 <code>b.cleanStack()<\/code> \u0438 <code>c.cleanStack()<\/code>.<\/p>\n<p><code>cleanStack<\/code> &#8212; \u043c\u0435\u0442\u043e\u0434 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439. \u041e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>Completion<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <em>\u043a\u0430\u043a\u043e\u0439-\u0442\u043e<\/em> \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u0430\u043c\u0438 \u0442\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438.<\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043d\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 <code>anyOf(a, b, c)<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 <code>b.stack<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>AnyOf<\/code>. \u0418 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>AnyOf<\/code> \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438. \u0415\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u0443\u0434\u0430\u043b\u0438\u043c &#8212; \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e. \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0434\u0430\u043b\u0438\u043c \u043d\u0435 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>AnyOf<\/code>, \u0430 \u0447\u0435\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0435? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>cleanStack<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0437 \u0441\u0442\u0435\u043a\u0430 \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u041e\u043f\u0435\u0440\u0438\u0440\u0443\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u0435\u0441\u043b\u0438 \u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430 \u0438\u0441\u043a\u0430\u043b\u0430 \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441.<\/p>\n<p><a class=\"anchor\" name=\"allof\" id=\"allof\"><\/a><\/p>\n<h3>10. allOf<\/h3>\n<p><code>allOf<\/code> &#8212; \u044d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 vararg \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>CompletableFuture<\/code>. \u0418 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c <code>anyOf<\/code>, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u043e\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0444\u044c\u044e\u0447\u0435\u0439. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CompletableFuture.AllOf<\/code>, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0435 \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>CompletableFuture.BiRelay<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443 <code>Bi*<\/code>?<\/p>\n<p>\u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u0444\u044c\u044e\u0447\u0430 \u0442\u0443\u0442 \u043d\u0435 \u043e\u0434\u043d\u0430, \u0438\u0445 \u043c\u043d\u043e\u0433\u043e, \u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0435\u0449\u0451 \u0438 \u0441\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e:<\/p>\n<pre><code>                   dep5                 \/       \\           dep3            dep4         \/      \\          \/  \\     dep1         dep2   src5  src6    \/  \\         \/  \\  src1  src2   src3  src4<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f <code>src5<\/code> \u0438 <code>src6<\/code> &#8212; \u043e\u043d\u0438 \u0442\u0440\u0438\u0433\u0435\u0440\u044f\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 <code>dep4<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442\u0441\u044f <code>dep1<\/code> \u0438 <code>dep2<\/code> &#8212; \u043e\u043d\u0438 \u0442\u0440\u0438\u0433\u0435\u0440\u044f\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 <code>dep3<\/code>. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <code>dep4<\/code> \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0442\u043e \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u043e \u0442\u0440\u0438\u0433\u0435\u0440\u0438\u0442\u0441\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 <code>dep5<\/code>.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0444\u044c\u044e\u0447\u0438 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043c\u043e\u0433\u0443\u0442 \u0438 \u043d\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0432\u043f\u0440\u0430\u0432\u0435 \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435.<\/p>\n<p>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 <code>src*<\/code>, \u0432 \u0438\u0442\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0447\u0435\u043d\u043e \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c <code>O(log N)<\/code> \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 <code>dep*<\/code> \u0444\u044c\u044e\u0447\u0435\u0439, \u0433\u0434\u0435 <code>N<\/code> &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u044c\u044e\u0447\u0435\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 <code>allOf<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0435\u0432\u0435\u043b\u0438\u043a\u0438. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0435 <code>N<\/code> \u0444\u044c\u044e\u0447\u0435\u0439 \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b \u043e\u043d\u0438 \u0432\u0441\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041d\u043e \u0438 \u0446\u0435\u043d\u0430 \u0443 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c &#8212; \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u0438. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043e\u0431\u043c\u0435\u043d \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u044b\u0439.<\/p>\n<p>\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0443 \u043c\u043d\u043e\u0433\u0438\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b \u0432\u043e\u043f\u0440\u043e\u0441 &#8212; \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438 \u0431\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043d\u0435 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 <code>Collection<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u0412\u0435\u0434\u044c <code>anyOf<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>args.clone()<\/code>, \u0442.\u0435. \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0430 <code>allOf<\/code> \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u0441\u044b\u043b\u043a\u0435 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u043b\u0438\u0431\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e. \u0412 \u043d\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0438\u043c\u0435\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 2 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438.<\/p>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0442\u043e\u0447\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b. \u0418 \u044f \u0431\u044b\u043b \u0431\u044b \u0440\u0430\u0434 \u0434\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442, \u043d\u043e \u043d\u0435 \u043c\u043e\u0433\u0443. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>anyOf<\/code> \u0438 <code>allOf<\/code> \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438-\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e <code>anyOf<\/code>, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0439\u0441\u044f, \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0441 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u0432\u0443\u043c\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438. \u0417\u0430\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0434\u043b\u044f <code>allOf<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>thenCombine<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0442 \u0432\u0430\u043c \u043c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 <code>Iterable<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0443\u0441\u0442\u044c \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f, \u043d\u043e \u0432\u044b\u0441\u043e\u0442\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 <code>O(log N)<\/code>. \u041c\u043e\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"java\">public static CompletableFuture&lt;Void> myAllOf(Iterable&lt;CompletableFuture&lt;?>> futs) {     var stack = new ArrayList&lt;CompletableFuture&lt;?>>();      int i = 0;     for (CompletableFuture&lt;?> fut : futs) {         if (fut.isDone()) {             if (!fut.isCompletedExceptionally()) {                 continue;             }         }          for (int k = i; (k &amp; 1) != 0; k >>>= 1) {             fut = stack.removeLast().thenCombine(fut, (l, r) -> null);         }          stack.add(fut);         i++;     }      if (i == 0) {         return CompletableFuture.completedFuture(null);     }      CompletableFuture&lt;?> fut = stack.removeLast();      while (!stack.isEmpty()) {         fut = stack.removeLast().thenCombine(fut, (l, r) -> null);     }      return fut.thenApply(v -> null); }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u0442\u0443\u0442 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0433\u0438\u044e \u043d\u0435 \u0431\u0443\u0434\u0443, \u0441\u0442\u0430\u0442\u044c\u044f \u0438 \u0431\u0435\u0437 \u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f. \u0414\u0443\u043c\u0430\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0435\u043a\u0430, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043d\u0451\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043c (\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0432\u044b\u0441\u043e\u0442\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>CompletableFuture<\/code>, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c, \u0432\u0435\u0434\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 <code>BiRelay<\/code>, \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0430\u043a \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u043f\u0430\u043c\u044f\u0442\u044c. \u0427\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u043c\u043e.<\/p>\n<p><a class=\"anchor\" name=\"whymrlea\" id=\"whymrlea\"><\/a><\/p>\n<h2>11. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0414\u0430\u0433\u0430 \u041b\u0438<\/h2>\n<p>\u0421\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430 \u044d\u0442\u043e\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043b\u0430\u0431\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u044c \u0440\u0430\u0437 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <code>CompletableFuture<\/code>, \u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432 <code>java.util.concurrent<\/code>, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u044b \u043d\u0435 \u043f\u043e \u043a\u0430\u043d\u043e\u043d\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Java. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043e\u0447\u0435\u043d\u044c \u043f\u0435\u0440\u0435\u0443\u0441\u043b\u043e\u0436\u043d\u0451\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b (<code>CompletableFuture#waitingGet<\/code>) \u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0442\u0430\u043a \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043c\u0435\u043d\u044f \u0431\u044b \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u0437\u0430\u0447\u043c\u044b\u0440\u0438\u043b\u0438.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u044f \u0447\u0438\u0442\u0430\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u044f \u043f\u0440\u0438\u0448\u0451\u043b \u043a \u0434\u0432\u0443\u043c \u0432\u044b\u0432\u043e\u0434\u0430\u043c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0432\u0441\u0435\u043c \u043d\u0430\u043c \u0441\u0442\u0438\u043b\u0435, \u0442\u043e \u043a\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u043d\u0435 \u0442\u0440\u0438 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u043e\u043a, \u0430 \u0432\u0441\u0435 \u0434\u0435\u0441\u044f\u0442\u044c \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435. \u0410 \u0442\u0430\u043a &#8212; \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0438 \u0441\u043b\u043e\u0436\u0435\u043d \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u044b \u043c\u043e\u0433 \u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0433\u043e\u043b\u043e\u0432\u0435. \u041d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0441 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0431\u044b\u043b\u043e \u0431\u044b \u043b\u0443\u0447\u0448\u0435. \u0410 \u0435\u0449\u0451 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c&#8230; \u0412 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u0448\u044c \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0438 \u0434\u0430\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0435\u0433\u043e \u0446\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 &#8212; \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043c\u0435\u043d\u0430:<\/p>\n<ul>\n<li>\n<p><code>a<\/code> &#8212; source<\/p>\n<\/li>\n<li>\n<p><code>b<\/code> &#8212; second source<\/p>\n<\/li>\n<li>\n<p><code>c<\/code>, <code>q<\/code> &#8212; completion (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438 <code>c<\/code>, \u0438 <code>q<\/code> &#8212; \u044d\u0442\u043e K, \u043d\u0443 \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438)<\/p>\n<\/li>\n<li>\n<p><code>d<\/code> &#8212; dependent<\/p>\n<\/li>\n<li>\n<p><code>e<\/code> &#8212; executor<\/p>\n<\/li>\n<li>\n<p><code>f<\/code> &#8212; function<\/p>\n<\/li>\n<li>\n<p><code>h<\/code> &#8212; head<\/p>\n<\/li>\n<li>\n<p><code>r<\/code> &#8212; result, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0430\u0432\u0435\u043d <code>a.result<\/code><\/p>\n<\/li>\n<li>\n<p><code>s<\/code> &#8212; second result, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0440\u0430\u0432\u0435\u043d <code>b.result<\/code><\/p>\n<\/li>\n<li>\n<p><code>t<\/code>, <code>x<\/code> &#8212; throwable<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u0443\u043a\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043d\u043e\u0433\u0434\u0430 <code>f<\/code> &#8212; \u044d\u0442\u043e <code>future<\/code>, \u0430 <code>t<\/code> &#8212; \u044d\u0442\u043e <code>tail<\/code>. \u042f \u043d\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0434\u043a\u0438\u0445 \u0438\u043c\u0451\u043d, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438, \u043d\u043e \u0438\u0434\u0435\u044f \u0443 \u043d\u0438\u0445 \u0432\u0441\u0435\u0445 \u0442\u0430 \u0436\u0435. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0440\u0435\u0448\u0438\u0442\u0435 \u0435\u0433\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c. \u041e\u043d \u043f\u0440\u0430\u0432\u0434\u0430 \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u0435\u043d, \u043a\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434.<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435, \u043f\u0443\u0441\u0442\u044c \u0432 \u043a\u043e\u0434\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043c\u0430\u043b\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, javadoc \u043d\u0430\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438 <code>Overview<\/code> \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 &#8212; \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u0438 \u0441\u043e\u0432\u0435\u0442\u0443\u044e\u0442\u0441\u044f \u043a \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044e. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0435\u0449\u0451 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435.<\/p>\n<p><a class=\"anchor\" name=\"final\" id=\"final\"><\/a><\/p>\n<h2>12. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><code>CompletableFuture<\/code> &#8212; \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0441\u0438\u043b\u044c\u043d\u043e\u0439 \u0431\u043e\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u0425\u043e\u0442\u044f \u0441\u043b\u043e\u0436\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0437\u0430 \u0432\u0441\u0435\u0445, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0441\u0435\u0431\u044f. \u0411\u0443\u0434\u044c \u0442\u043e legacy \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0438\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 &#8212; \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f \u0433\u0440\u0443\u0441\u0442\u0438\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0445. \u0412\u0440\u0430\u0433\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0432 \u043b\u0438\u0446\u043e, \u0438 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u044f \u0442\u043e\u0436\u0435 \u0443\u0437\u043d\u0430\u043b \u043a\u043e\u0435-\u0447\u0442\u043e \u043d\u043e\u0432\u043e\u0435.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <code>CompletableFuture<\/code> &#8212; \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b \u043d\u0435 \u0432\u0441\u0435 \u0442\u0435\u043c\u044b, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u0447\u0451\u043c \u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u0430 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432\u044b \u0443\u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e, \u0447\u0442\u043e \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/784144\/\"> https:\/\/habr.com\/ru\/articles\/784144\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><code>java.util.concurrent.CompletableFuture<\/code> &#8212; \u043a\u043b\u0430\u0441\u0441 \u043d\u0435 \u043d\u043e\u0432\u044b\u0439. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u043b \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u043e \u0432\u0441\u0451\u043c \u0441\u0432\u043e\u0451\u043c \u0432\u0435\u043b\u0438\u0447\u0438\u0438 \u0432 2014-\u043c \u0433\u043e\u0434\u0443 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c Java 8. \u041c\u043d\u043e\u0433\u043e \u043b\u0435\u0442 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u0440\u043e\u0448\u043b\u043e, \u0430 \u043f\u0440\u043e\u0449\u0435 \u043e\u043d \u043d\u0435 \u0441\u0442\u0430\u043b.<\/p>\n<p>\u041c\u044b \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0445 &#171;\u0444\u044c\u044e\u0447\u0438&#187;. \u041d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0447\u0430\u0441\u0442\u044f\u043c \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c.<\/p>\n<h2>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h2>\n<ol>\n<li>\n<p><a href=\"#intro\" rel=\"noopener noreferrer nofollow\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#inside\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#complete\" rel=\"noopener noreferrer nofollow\">\u041a\u0442\u043e \u0438 \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#compose\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#thread\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#order\" rel=\"noopener noreferrer nofollow\">\u0412 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#wait\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b get\/join<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#exceptions\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#anyof\" rel=\"noopener noreferrer nofollow\">anyOf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#allof\" rel=\"noopener noreferrer nofollow\">allOf<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#whymrlea\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0414\u0430\u0433\u0430 \u041b\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#final\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"intro\" id=\"intro\"><\/a><\/p>\n<h2>1. \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p><code>CompletableFuture<\/code> &#8212; \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>Future<\/code> (&#171;\u0441\u0442\u0430\u0440\u044b\u0439&#187;), \u0442\u0430\u043a \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code>CompletionStage<\/code> (&#171;\u043d\u043e\u0432\u044b\u0439&#187;). \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0447\u0430\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u041c\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c javadoc, \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u044f \u0432\u0441\u0451 \u0436\u0435 \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0435.<\/p>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0421\u044e\u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e).<br \/>\u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>get*<\/code> \u0438 <code>join<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<br \/>\u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>complete*<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>CompletableFuture<\/code> \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>then*<\/code>, <code>when*<\/code>, <code>handle*<\/code> \u0438 \u0442.\u0434. \u041c\u043d\u043e\u0433\u043e \u0438\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0447\u0438\u0435 \u043c\u0435\u043b\u043e\u0447\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434. \u0412 \u043d\u0451\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0441\u0430\u043c\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439.<\/p>\n<pre><code class=\"java\">\/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435. CompletableFuture&lt;Void> asyncOp = CompletableFuture.runAsync(     () -> doAsyncOperation() );  \/\/ \u041f\u043e\u043a\u0430 \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u0442\u043e \u0435\u0449\u0451. doSomethingElse();  \/\/ \u0410 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. asyncOp.join();<\/code><\/pre>\n<p>\u0424\u044c\u044e\u0447\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>*Task<\/code>, \u043d\u0435\u0442 \u044f\u0432\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0417\u0430 \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u0430\u043c \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p><a class=\"anchor\" name=\"inside\" id=\"inside\"><\/a><\/p>\n<h2>2. \u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438<\/h2>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u0430\u0451\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 (\u0432 \u043d\u0451\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 API), \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043e\u043d \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u043f\u043e\u043b\u044f:<\/p>\n<pre><code class=\"java\">volatile Object result;       \/\/ Either the result or boxed AltResult volatile Completion stack;    \/\/ Top of Treiber stack of dependent actions<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u043b\u0435 <code>result<\/code> \u0440\u0430\u0432\u043d\u043e <code>null<\/code>. \u0414\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0445 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>NIL<\/code> &#8212; \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0432\u0435\u043d <code>null<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0430\u043d\u0441 <code>java.util.concurrent.CompletableFuture.AltResult<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u0435\u043a\u0442-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430 \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0435 \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u043d\u0438 \u0432 \u043a\u0430\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0442.\u0435. \u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 \u0432\u0440\u043e\u0434\u0435 <code>cancelled<\/code> \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u0424\u044c\u044e\u0447\u0430, \u043e\u0442\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>cancel<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>AltResult<\/code> \u0441 <code>CancellationException<\/code>. \u0422.\u0435. \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f <code>result<\/code> \u0440\u043e\u0432\u043d\u043e 3.<\/p>\n<p>\u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0439 <code>null<\/code> \/ \u043d\u0435 <code>null<\/code> &#8212; \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0444\u044c\u044e\u0447\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041c\u0435\u0442\u043e\u0434 <code>isDone<\/code> \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 <code>isCompletedExceptionally<\/code>, \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c <code>AltResult<\/code> \u0438 \u043d\u0435 \u0440\u0430\u0432\u0435\u043d <code>NIL<\/code> (<code>NIL<\/code> \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0440\u0430\u0432\u0435\u043d <code>new AltResult(null)<\/code>). <code>isCancelled<\/code> \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0438\u043f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p><code>stack<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0444\u044c\u044e\u0447\u0438. \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p><a class=\"anchor\" name=\"complete\" id=\"complete\"><\/a><\/p>\n<h2>3. \u041a\u0442\u043e \u0438 \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0438<\/h2>\n<p>\u0424\u044c\u044e\u0447\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u043f\u0440\u0438\u0447\u0438\u043d. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>complete<\/code> \/ <code>completeExceptionally<\/code> \/ <code>cancel<\/code>.<\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043a\u043e\u0434, \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f <code>Runnable<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>CompletableFuture#runAsync<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 &#8212; \u0431\u044b\u043b\u0430 \u0437\u0430\u043a\u043e\u043c\u043f\u043b\u0438\u0447\u0435\u043d\u0430 <code>source<\/code> \u0444\u044c\u044e\u0447\u0430. \u0412 API <code>CompletionStage<\/code> \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u0442 \u0440\u0430\u043d\u0435\u0435 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;Object> source = giveMeTheFuture();  CompletableFuture&lt;Object> dependent = source.thenApply(this::transformResult);<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>thenApply<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u0430\u044f \u0441\u0432\u044f\u0437\u044c. \u041e\u0431\u044a\u0435\u043a\u0442 <code>source<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <code>dependent<\/code> \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0451\u043c (\u043d\u0430 \u043d\u0438\u0445) <code>complete<\/code> \/ <code>completeExceptionaly<\/code> \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c.<\/p>\n<p>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0447\u0435\u0442\u044b\u0440\u0435 &#8212; \u0442\u0430\u0439\u043c\u0430\u0443\u0442. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0444\u044c\u044e\u0447\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b <code>orTimeout<\/code> \/ <code>completeOnTimeout<\/code> \u0438 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u043e \u0444\u044c\u044e\u0447\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u043c\u0435\u043d\u043e\u0439 (\u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>cancel<\/code>), \u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 <code>completeOnTimeout<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442 <em>\u0442\u0435\u043a\u0443\u0449\u0443\u044e<\/em> \u0444\u044c\u044e\u0447\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0451.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0444\u044c\u044e\u0447\u0443, \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0451 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 <code>RESULT.compareAndSet(this, null, res);<\/code> (<code>RESULT<\/code> &#8212; \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 <code>VarHandle<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u044f <code>result<\/code>, \u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>CompletableFuture<\/code>).<\/p>\n<p>\u0427\u0435\u043c \u0445\u043e\u0440\u043e\u0448 \u0434\u0430\u043d\u043d\u044b\u0439 <code>compareAndSet<\/code> \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 <code>result<\/code> \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0441 <code>null<\/code> \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041c\u0435\u0442\u043e\u0434\u044b <code>complete*<\/code> \/ <code>cancel<\/code> \u043a\u0430\u043a \u0440\u0430\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e\u0433\u043e CAS-\u0430. \u0412 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0433\u043e\u043d\u043a\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u043e\u0433\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442\u0443\u0442 \u0432\u0441\u0451 \u0447\u0435\u0441\u0442\u043d\u043e. \u041a\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439, \u0442\u043e\u0442 \u0438 \u0432\u044b\u0438\u0433\u0440\u0430\u043b.<br \/>\u0415\u0441\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u044b <code>obtrude*<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u0442\u0435\u0440\u0435\u0442\u044c <code>result<\/code>, \u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e, \u043d\u0430\u0441\u0442\u0430\u0451\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0444\u044c\u044e\u0447\u0430\u043c\u0438 (\u043a\u0430\u043a-\u0442\u043e \u043b\u0435\u0436\u0430\u0449\u0438\u043c\u0438 \u0432 \u043f\u043e\u043b\u0435 <code>stack<\/code>) \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u0445.<\/p>\n<p><a class=\"anchor\" name=\"compose\" id=\"compose\"><\/a><\/p>\n<h2>4. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/h2>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u044b\u0432\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435, \u0432\u0441\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u044c\u044e\u0447\u0435\u0439.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>B<\/code> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>A<\/code> &#8212; \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 &#8212; \u043d\u043e\u0432\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>C<\/code> \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u0431\u0435 <code>A<\/code> \u0438 <code>B<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b, \u0438\u043b\u0438 \u0436\u0435 \u0445\u043e\u0442\u044f-\u0431\u044b \u043e\u0434\u043d\u0430 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 <code>A<\/code> \u0438 <code>B<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0438 \u0442.\u0434.<\/p>\n<p>\u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u043d\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u0443\u0441\u0442\u044c \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445.<\/p>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u044c\u044e\u0447\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044f <code>stack<\/code>. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0441\u0442\u0435\u043a, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0430 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Treiber_stack\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0436\u043d\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/a>. \u0412\u0441\u0451 \u0432\u043d\u0443\u0442\u0440\u0438 <code>CompletableFuture<\/code> \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 CAS-\u0430\u0445 \u0438 \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0433\u043e\u043d\u043a\u0430\u043c, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043b\u043e\u043a\u043e\u0432 \u0442\u0430\u043c \u043d\u0435\u0442. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044f <code>stack<\/code> \u0443 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438. \u0412 \u0433\u043e\u043b\u043e\u0432\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0438\u043f \u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <code>dependent<\/code> \u0444\u044c\u044e\u0447\u0443.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b &#8212; <code>thenApply(Function&lt;...> fn)<\/code>. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 <code>CompletableFuture<\/code> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Functor_(functional_programming)\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u043c<\/a>, \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>fn<\/code>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438. \u041e\u043f\u0443\u0441\u043a\u0430\u044f \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>thenApply<\/code> \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">CompletableFuture&lt;V> d = newIncompleteFuture(); unipush(new UniApply&lt;T,V>(e, d, this, f)); return d;<\/code><\/pre>\n<p>\u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0443\u044e \u0444\u044c\u044e\u0447\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 <code>Completion<\/code> \u0432 \u0441\u0442\u0435\u043a \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c. \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 <code>Completion<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043a\u0430\u043a <code>source<\/code> (<code>this<\/code>), \u0442\u0430\u043a \u0438 \u043d\u0430 <code>dependent<\/code> (<code>d<\/code>) \u0444\u044c\u044e\u0447\u0438, \u043d\u0443 \u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 <code>f<\/code> \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435. <code>e<\/code> &#8212; \u044d\u0442\u043e <code>Executor<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>f<\/code>, \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0430\u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c <code>source<\/code> \u0444\u044c\u044e\u0447\u0443, \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0435\u0451 \u043f\u043e\u043b\u044f <code>stack<\/code> (\u0441 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f) \u0438 \u0432\u044b\u0437\u043e\u0432 <code>Completion#tryFire<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445. \u0414\u043b\u044f <code>UniApply<\/code> \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">final CompletableFuture&lt;V> tryFire(int mode) {     CompletableFuture&lt;V> d; ...     Object r; ... Function&lt;? super T,? extends V> f;     ...         try {             ...                 @SuppressWarnings(\"unchecked\") T t = (T) r;                 d.completeValue(f.apply(t));             ...         } catch (Throwable ex) {             d.completeThrowable(ex);         }     }     ... }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435. \u041f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 <code>source<\/code> \u0444\u044c\u044e\u0447\u0438 \u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>f<\/code>, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435, \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0444\u044c\u044e\u0447\u0438 <code>d<\/code>. \u0426\u0438\u043a\u043b \u0437\u0430\u043c\u043a\u043d\u0443\u043b\u0441\u044f.<\/p>\n<p><a class=\"anchor\" name=\"thread\" id=\"thread\"><\/a><\/p>\n<h2>5. \u041a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434<\/h2>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 &#8212; \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u0432\u0430\u0441 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441\u0435\u0431\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0438 \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u0438.<\/p>\n<p>\u041a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443? \u041b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 <code>accept*<\/code>\/<code>run*<\/code>\/<code>then*<\/code>\/<code>handle*<\/code>\/<code>when*<\/code> \u0438 \u0442.\u0434. \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Function<\/code> \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u043d\u0435\u0435. \u0413\u0434\u0435 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c <code>Async<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>thenApplyAsync<\/code>, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 executor-\u0435. \u0415\u0441\u043b\u0438 executor \u044f\u0432\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 <code>CompletableFuture#defaultExecutor<\/code>. \u041e\u043d, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u043e\u0432\u043f\u0430\u0434\u0451\u0442 \u0441 <code>ForkJoinPool.commonPool<\/code> (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438).<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">\/\/ \u0412\u043e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434: fut.thenApplyAsync(res -> foo(res), e);  \/\/ \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0432\u043e\u0442 \u044d\u0442\u043e\u0442: fut.thenCompose(res -> CompletableFuture.runAsync(() -> foo(res), e));<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u0443\u0436\u0435 \u043e \u043d\u0435 <code>Async<\/code> \u043c\u0435\u0442\u043e\u0434\u0430\u0445. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439 \u0444\u044c\u044e\u0447\u0451\u0439, \u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0442.\u0435. \u0441\u0440\u0430\u0437\u0443 \u0436\u0435. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430 &#8212; \u0440\u0430\u0437 \u0444\u044c\u044e\u0447\u0430 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u0434\u0440\u0443\u0433 \u043d\u0430\u0447\u043d\u0451\u0442 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 <code>stack<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043d\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0443 \u043d\u0430\u0441 \u043c\u0430\u043b\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0437\u0430 \u0442\u0435\u043c, \u043a\u0430\u043a\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0444\u044c\u044e\u0447\u0435 \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d <code>onTimeout<\/code>, \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0448\u043b\u043e, \u0442\u043e \u0432\u0430\u0448\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>CompletableFutureDelayScheduler<\/code> (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/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-364400","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364400","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=364400"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/364400\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=364400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=364400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=364400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}