Skip to content

Commit

Permalink
Download multithreading java homework
Browse files Browse the repository at this point in the history
  • Loading branch information
JackKaif committed Feb 21, 2024
1 parent 8e89774 commit 6eb9796
Show file tree
Hide file tree
Showing 12 changed files with 282 additions and 0 deletions.
2 changes: 2 additions & 0 deletions java-advanced-ru/multithreading-java/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.gradle/
build/
2 changes: 2 additions & 0 deletions java-advanced-ru/multithreading-java/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test:
gradle test
73 changes: 73 additions & 0 deletions java-advanced-ru/multithreading-java/README.html

Large diffs are not rendered by default.

51 changes: 51 additions & 0 deletions java-advanced-ru/multithreading-java/README.md
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
```

### Подсказки

* Исходные данные (массив с числами) можно передать в конструктор при создании экземпляра потока

* Чтобы удобно получить результат работы потока, можно создать геттер
26 changes: 26 additions & 0 deletions java-advanced-ru/multithreading-java/build.gradle
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 java-advanced-ru/multithreading-java/examples/ThreadExample.java
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.
1 change: 1 addition & 0 deletions java-advanced-ru/multithreading-java/settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rootProject.name = 'multithreading-java'
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
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package exercise;

// BEGIN

// END
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package exercise;

// BEGIN

// END
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);
}
}

0 comments on commit 6eb9796

Please sign in to comment.