HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: java, completablefuture, java.util.concurrent, thread pool, thread.sleep(timeunit.seconds.tomillis(sec));</p>
1 <p>Теги: java, completablefuture, java.util.concurrent, thread pool, thread.sleep(timeunit.seconds.tomillis(sec));</p>
2 <p>Время от времени появляется необходимость выполнить асинхронно (т.е. одновременно с основным действием программы выполняется другая задача) какой-нибудь код. Например, отправить письмо по e-mail или что-нибудь из базы данных прочитать. В Java для подобных операций можно создать поток и выполнить в нём нужное действие. Например, так:</p>
2 <p>Время от времени появляется необходимость выполнить асинхронно (т.е. одновременно с основным действием программы выполняется другая задача) какой-нибудь код. Например, отправить письмо по e-mail или что-нибудь из базы данных прочитать. В Java для подобных операций можно создать поток и выполнить в нём нужное действие. Например, так:</p>
3 private void simpleRun() throws ExecutionException, InterruptedException { final CompletableFuture&lt;String&gt; future = new CompletableFuture&lt;&gt;(); new Thread( () -&gt; { System.out.println("job started"); sleep(3); future.complete("feature done"); System.out.println("job done"); }).start(); System.out.println("waiting..."); String result = future.get(); System.out.println("finished, result:" + result); }<h2>Что здесь происходит?</h2>
3 private void simpleRun() throws ExecutionException, InterruptedException { final CompletableFuture&lt;String&gt; future = new CompletableFuture&lt;&gt;(); new Thread( () -&gt; { System.out.println("job started"); sleep(3); future.complete("feature done"); System.out.println("job done"); }).start(); System.out.println("waiting..."); String result = future.get(); System.out.println("finished, result:" + result); }<h2>Что здесь происходит?</h2>
4 <p>Просто создаётся поток и имитируется задача длительностью 3 сек.: вызов<strong>Thread.sleep(TimeUnit.SECONDS.toMillis(sec));</strong>с перехваченным исключением. Задача возвращает результат через CompletableFuture.</p>
4 <p>Просто создаётся поток и имитируется задача длительностью 3 сек.: вызов<strong>Thread.sleep(TimeUnit.SECONDS.toMillis(sec));</strong>с перехваченным исключением. Задача возвращает результат через CompletableFuture.</p>
5 <p>Это вполне рабочий вариант, но можно сделать заметно проще:</p>
5 <p>Это вполне рабочий вариант, но можно сделать заметно проще:</p>
6 private void asyncRun() throws ExecutionException, InterruptedException { final CompletableFuture&lt;String&gt; future = CompletableFuture.supplyAsync(()-&gt; { System.out.println("job started"); sleep(3); System.out.println("job done"); return "feature done"; }); System.out.println("waiting..."); String result = future.get(); System.out.println("finished, result:" + result); }<p>В этом коде используется интересная возможность<strong>CompletableFuture</strong>из пакета<strong>java.util.concurrent</strong>.<strong>CompletableFuture</strong>"умеет" запускать код в параллельном потоке, и при этом использует встроенный<strong>thread pool</strong>. Его использование упрощает код и даёт прирост в производительности приложения.</p>
6 private void asyncRun() throws ExecutionException, InterruptedException { final CompletableFuture&lt;String&gt; future = CompletableFuture.supplyAsync(()-&gt; { System.out.println("job started"); sleep(3); System.out.println("job done"); return "feature done"; }); System.out.println("waiting..."); String result = future.get(); System.out.println("finished, result:" + result); }<p>В этом коде используется интересная возможность<strong>CompletableFuture</strong>из пакета<strong>java.util.concurrent</strong>.<strong>CompletableFuture</strong>"умеет" запускать код в параллельном потоке, и при этом использует встроенный<strong>thread pool</strong>. Его использование упрощает код и даёт прирост в производительности приложения.</p>
7 <p>Ведь на создание нового потока не расходуются системные ресурсы. Более того, встроенный<strong>thread pool</strong>уже оптимизирован и работает эффективнее большинства пулов, созданных пользователем.</p>
7 <p>Ведь на создание нового потока не расходуются системные ресурсы. Более того, встроенный<strong>thread pool</strong>уже оптимизирован и работает эффективнее большинства пулов, созданных пользователем.</p>
8 <p>Однако надо помнить и об ограничениях. Например, разные модули программы могут конкурировать за потоки из общего пула, что может привести к дополнительным ожиданиям.</p>
8 <p>Однако надо помнить и об ограничениях. Например, разные модули программы могут конкурировать за потоки из общего пула, что может привести к дополнительным ожиданиям.</p>
9 <p>В<a>следующей заметке</a>мы рассмотрим другие интересные возможности CompletableFuture из пакета java.util.concurrent.</p>
9 <p>В<a>следующей заметке</a>мы рассмотрим другие интересные возможности CompletableFuture из пакета java.util.concurrent.</p>
10 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
10 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
11  
11