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<String> future = new CompletableFuture<>(); new Thread( () -> { 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<String> future = new CompletableFuture<>(); new Thread( () -> { 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<String> future = CompletableFuture.supplyAsync(()-> { 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<String> future = CompletableFuture.supplyAsync(()-> { 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