-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Download multithreading java homework
- Loading branch information
Showing
12 changed files
with
282 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
.gradle/ | ||
build/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
test: | ||
gradle test |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# Многопоточность в Java | ||
|
||
В этом домашнем задании мы напишем первое многопоточное приложение на Java. Наша программа будет обрабатывать в многопоточном режиме массив целых чисел и находить в нём максимум и минимум. | ||
|
||
## Ссылки | ||
|
||
* [Класс Thread – представляет собой поток выполнения в Java](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html) | ||
* [Метод run() – содержит логику, которую должен выполнить поток](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html#run()) | ||
* [Метод start() – запускает поток](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html#start()) | ||
* [Метод join() – приостанавливает текущий поток до тех пор, пока не закончится выполнение указанного](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/Thread.html#join()) | ||
|
||
## main/java/exercise/MaxThread.java | ||
|
||
## Задачи | ||
|
||
* Создайте поток, который будет находить максимальное число в массиве целых чисел. Класс потока унаследуйте от класса `java.lang.Thread`. Переопределите в классе метод `run()`, в котором напишите логику поиска максимального числа в массиве. | ||
|
||
## main/java/exercise/MinThread.java | ||
|
||
## Задачи | ||
|
||
* Создайте поток, который будет находить минимальное число в массиве целых чисел. Класс потока от унаследуйте от класса `java.lang.Thread`. Переопределите в классе метод `run()`, в котором напишите логику поиска минимального числа. | ||
|
||
## main/java/exercise/App.java | ||
|
||
## Задачи | ||
|
||
* В классе создайте публичный статический метод `getMinMax()`. Метод принимает в качестве аргумента массив целых чисел. Условимся, что массив содержит минимум один элемент. Метод должен возвращать максимальный и минимальный элемент массива в виде словаря `Map<String, Integer>`: | ||
|
||
```java | ||
int[] numbers = {10, -4, 67, 100, -100, 8}; | ||
|
||
System.out.println(App.getMinMax(numbers)); // => {min=-100, max=100} | ||
``` | ||
|
||
Реализуйте метод так, чтобы вычисления производились в два потока. Первый поток ищет максимальное число в массиве, второй – минимальное. Используйте для этого созданные классы потоков. | ||
|
||
* Чтобы наглядно отследить старт и окончание работы потока, добавьте в метод логгирование. | ||
|
||
Пример вывода лога: | ||
|
||
```bash | ||
INFO: Thread Thread-3 started | ||
INFO: Thread Thread-3 finished | ||
``` | ||
|
||
### Подсказки | ||
|
||
* Исходные данные (массив с числами) можно передать в конструктор при создании экземпляра потока | ||
|
||
* Чтобы удобно получить результат работы потока, можно создать геттер |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
plugins { | ||
id 'java' | ||
id 'com.adarshr.test-logger' version '2.1.1' | ||
} | ||
|
||
repositories { | ||
mavenCentral() | ||
} | ||
|
||
dependencies { | ||
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.0-M1' | ||
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.0-M1' | ||
testImplementation 'org.assertj:assertj-core:3.19.0' | ||
} | ||
|
||
test { | ||
useJUnitPlatform() | ||
} | ||
|
||
testlogger { | ||
showStandardStreams = true | ||
} | ||
|
||
tasks.withType(JavaCompile) { | ||
options.encoding = "UTF-8" | ||
} |
69 changes: 69 additions & 0 deletions
69
java-advanced-ru/multithreading-java/examples/ThreadExample.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
// Чтобы создать поток, нужно создать класс и унаследовать его от класса Thread | ||
public class ThreadExample extends Thread { | ||
|
||
// В классе нужно переопределить метод run() | ||
// В методе содержится логика, которую поток будет выполнять | ||
@Override | ||
public void run() { | ||
// Метод getName() выводит имя потока | ||
System.out.println("Thread " + getName()); | ||
} | ||
} | ||
|
||
public class Example { | ||
|
||
public static void main(String[] args) { | ||
|
||
// Создадим 5 потоков в цикле | ||
for (int i = 0; i < 5; i++) { | ||
|
||
// Создаём экземпляр потока | ||
ThreadExample thread = new ThreadExample(); | ||
// Запускаем поток при помощи метода start() | ||
// После этого начинает выполняться метод run() потока | ||
thread.start(); | ||
} | ||
} | ||
} | ||
|
||
// Вывод | ||
|
||
// Thread Thread-2 | ||
// Thread Thread-1 | ||
// Thread Thread-0 | ||
// Thread Thread-3 | ||
// Thread Thread-4 | ||
|
||
// Метод thread.join() | ||
|
||
// Метод thread.join() останавливает выполнение текущего потока до тех пор, | ||
// пока указанный поток не прекратит работу (или не будет прерван) | ||
|
||
|
||
public class Example1 { | ||
|
||
public static void main(String[] args) { | ||
|
||
// Создаём поток | ||
// Допустим, поток выполняет какие-то сложные вычисления | ||
MyThread thread = new MyThread(); | ||
// Запускаем поток | ||
thread.start(); | ||
|
||
// Прежде, чем выводить результаты вычислений | ||
// нужно дождаться окончания выполнения потока thread | ||
// Метод join() приостановит выполнение потока main до тех пор, | ||
// пока поток thread не завершит работу | ||
|
||
try { | ||
thread.join(); | ||
} catch (InterruptedException e) { | ||
System.out.println("Поток был прерван"); | ||
} | ||
|
||
// После окончания работы потока выводим результат вычислений | ||
// Допустим, для получения результатов вычисления в классе MyThread | ||
// мы определили метод getResults() | ||
System.out.println(thread.getResults()) | ||
} | ||
} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
rootProject.name = 'multithreading-java' |
13 changes: 13 additions & 0 deletions
13
java-advanced-ru/multithreading-java/src/main/java/exercise/App.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package exercise; | ||
|
||
import java.util.Map; | ||
import java.util.logging.Logger; | ||
import java.util.logging.Level; | ||
|
||
class App { | ||
private static final Logger LOGGER = Logger.getLogger("AppLogger"); | ||
|
||
// BEGIN | ||
|
||
// END | ||
} |
5 changes: 5 additions & 0 deletions
5
java-advanced-ru/multithreading-java/src/main/java/exercise/MaxThread.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package exercise; | ||
|
||
// BEGIN | ||
|
||
// END |
5 changes: 5 additions & 0 deletions
5
java-advanced-ru/multithreading-java/src/main/java/exercise/MinThread.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
package exercise; | ||
|
||
// BEGIN | ||
|
||
// END |
35 changes: 35 additions & 0 deletions
35
java-advanced-ru/multithreading-java/src/test/java/exercise/AppTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package exercise; | ||
|
||
import org.junit.jupiter.api.Test; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
|
||
import java.util.Map; | ||
|
||
class AppTest { | ||
@Test | ||
void testMinMax1() { | ||
|
||
int[] numbers = {10, -4, 67, 100, -100, 8}; | ||
Map<String, Integer> actual = App.getMinMax(numbers); | ||
Map<String, Integer> expected = Map.of("min", -100, "max", 100); | ||
assertThat(actual).isEqualTo(expected); | ||
} | ||
|
||
@Test | ||
void testMinMax2() { | ||
|
||
int[] numbers = {-2, 0}; | ||
Map<String, Integer> actual = App.getMinMax(numbers); | ||
Map<String, Integer> expected = Map.of("min", -2, "max", 0); | ||
assertThat(actual).isEqualTo(expected); | ||
} | ||
|
||
@Test | ||
void testMinMax3() { | ||
|
||
int[] numbers = {0}; | ||
Map<String, Integer> actual = App.getMinMax(numbers); | ||
Map<String, Integer> expected = Map.of("min", 0, "max", 0); | ||
assertThat(actual).isEqualTo(expected); | ||
} | ||
} |