Skip to content

Commit ff29462

Browse files
committed
add
1 parent 30c3143 commit ff29462

File tree

41 files changed

+781
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+781
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.gradle/
2+
build/

java-advanced-ru/asynchrony/.idea/.gitignore

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-advanced-ru/asynchrony/.idea/checkstyle-idea.xml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-advanced-ru/asynchrony/.idea/compiler.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-advanced-ru/asynchrony/.idea/gradle.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-advanced-ru/asynchrony/.idea/misc.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-advanced-ru/asynchrony/.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
test:
2+
gradle test
3+
4+
run:
5+
gradle run

java-advanced-ru/asynchrony/README.html

Lines changed: 70 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Асинхронность
2+
3+
Асинхронность в программировании — выполнение процесса в неблокирующем режиме, что позволяет основному потоку программы продолжить обработку.
4+
5+
## Ссылки
6+
7+
* [Класс CompletableFuture – представляет собой отложенный результат асинхронных вычислений](https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/util/concurrent/CompletableFuture.html)
8+
* [Класс Files – содержит статические методы для работы с файлами и директориями](https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/nio/file/Files.html)
9+
10+
## src/main/java/exercise/App.java
11+
12+
## Задачи
13+
14+
* Создайте асинхронный публичный статический метод `unionFiles()`. Метод должен асинхронно читать содержимое двух файлов, объединять эту информацию и записывать её в третий файл. Метод принимает три аргумента – пути до файлов в виде строки. Первые два аргумента – пути до файлов-источников, третий – путь до итогового файла. Метод может принимать абсолютный и относительный путь до файлов. Если хотя-бы один из файлов-источников не существует, на экран должно выводиться сообщение о возникшем исключении. Если итоговый файл не существует, он должен быть создан. Метод должен возвращать `CompletableFuture<String>`.
15+
16+
```java
17+
CompletableFuture<String> result = App.unionFiles("file1.txt", "file2.txt", "dest.txt");
18+
```
19+
20+
Конечно, чтение файлов можно выполнить и синхронно. Но представьте, что у нас сложные задачи, которые выполняются длительное время, например конвертация видеофайла. В этом случае, асинхронный, неблокирующий запуск задач позволит нам получить выигрыш.
21+
22+
* В методе `main()`, используя асинхронный метод `unionFiles()`, прочитайте информацию из двух файлов *src/main/resources/file1.txt* и *src/main/resources/file2.txt* и запишите её в третий файл в этой же директории. Имя файла выберите на своё усмотрение.
23+
24+
* Запустите программу при помощи команды `make run`. Убедитесь, что целевой файл создался и он содержит информацию из двух источников.
25+
26+
### Самостоятельная работа
27+
28+
* В классе `App` создайте асинхронный публичный статический метод `getDirectorySize()`, который считает размеры переданной директории не включая поддиректории. Размер директории складывается из размера всех файлов в директории. Метод должен вернуть `CompletableFuture<Long>`.
29+
30+
```java
31+
CompletableFuture<Long> size = App.getDirectorySize("dir/subdir");
32+
```
33+
34+
* Напишите тесты, проверяющие работу этого метода.
35+
36+
### Подсказки
37+
38+
* Для обработки возникших в асинхронном коде исключений можно использовать метод [exceptionally()](https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/util/concurrent/CompletableFuture.html#exceptionally(java.util.function.Function))
39+
40+
* Для того, чтобы независимо друг от друга выполнить две задачи, и затем сделать что-то после их выполнения, можно использовать метод [thenCombine()](https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/util/concurrent/CompletableFuture.html#thenCombine(java.util.concurrent.CompletionStage,java.util.function.BiFunction))

0 commit comments

Comments
 (0)