From 22fc85d3f3eeee18024c3ed4b46047f52e92d811 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Tue, 17 Oct 2017 11:50:59 +0300 Subject: [PATCH 01/11] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 127b1304a..a6de25e17 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ - используя асинхронные сервлеты 3.0 - сохранение данных в PostgreSQL используя [jDBI](http://jdbi.org/) - миграция базы [LiquiBase](http://www.liquibase.org/) -- использование в проекте [Guava](https://github.com/google/guava/wiki), [Thymleaf](http://www.thymeleaf.org/), [Lombook](https://projectlombok.org/), [StreamEx](https://github.com/amaembo/streamex), +- использование в проекте [Guava](https://github.com/google/guava/wiki), [Thymleaf](http://www.thymeleaf.org/), [Lombok](https://projectlombok.org/), [StreamEx](https://github.com/amaembo/streamex), [Typesafe Config](https://github.com/typesafehub/config), [Java Microbenchmark JMH](http://openjdk.java.net/projects/code-tools/jmh) ### Требование к участникам @@ -134,14 +134,14 @@ MatrixBenchmark.concurrentMultiply3 1000 ss 100 186,827 ± 11,882 - Maven. Поиск и разрешение конфликтов зависимостей - Подключаем логирование с общими настройкам - Библиотеки и фреймворки для работы с JDBC. -- Модуль persist +- Модуль persistence ## Занятие 5 - Разбор ДЗ - Сохранение в базу в batch-моде с обработкой конфликтов - Вставка в несколько потоков - Конфигурирование приложения (Typesafe config) -- Lombook +- Lombok ## Занятие 6 - Разбор ДЗ (доработка модели и модуля export) From 66dbb57f307e8ac7f01f61af948a3a315a40b4f5 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Mon, 23 Oct 2017 05:31:40 +0300 Subject: [PATCH 02/11] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a6de25e17..2d26e390c 100644 --- a/README.md +++ b/README.md @@ -99,9 +99,9 @@ ----- ## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Подсказки по HW1 -- не делайте 1000 000 тасок, лучше их сделать крупнее -- у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно -- наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Мои результаты: +- 1: не делайте 1000 000 тасок, лучше их сделать крупнее +- 2: у меня разница между 4 и 1000 тасками по времени незаметна, поэтому делайте просто и не делайте сложно +- 3: наконец: можно не считать значение элемента результирующей матрицы C за раз, а накапливать (`concurrentMultiply3`). Тогда трансформация B не нужна. Мои результаты: ``` Benchmark (matrixSize) Mode Cnt Score Error Units MatrixBenchmark.singleThreadMultiplyOpt 1000 ss 100 837,867 ± 25,530 ms/op From 4b3a183635f38c7190971038b7a720395f808f41 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 22 Feb 2018 18:07:56 +0300 Subject: [PATCH 03/11] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2d26e390c..6157a56d3 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ #### Скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... ---------------------------- +- [Как сделать Java код проще и нагляднее](https://habrahabr.ru/company/wrike/blog/349652/) ### Ресурсы (основы) - Intuit, Потоки выполнения. Синхронизация From 389d911b60d0e1ddca77dbde8c9d34311e5f115a Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 8 Nov 2018 16:37:46 +0300 Subject: [PATCH 04/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6157a56d3..e5fe3209b 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ > В видео в `LazySingleton` ошибка: должно быть как в коде проекта `instance == null` ### Структура памяти: куча, стек, permanent/metaspace - - JVM изнутри - оптимизация и профилирование. + - JVM изнутри - оптимизация и профилирование. - Stack and Heap - Дополнительно: - Из каких частей состоит память java процесса. From 45f97151852c296e41061236c0c9b5ab3e5dd331 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Thu, 27 Dec 2018 19:32:21 +0300 Subject: [PATCH 05/11] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e5fe3209b..2ece5d267 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ - Permanent область памяти - Java thread stack - Размер Java объектов + - Оптимизация памяти + - [Escape analysis и скаляризация: Пусть GC отдохнет](https://habr.com/company/jugru/blog/322348) + - [Условия для размещения объекта в стеке](https://stackoverflow.com/a/43002529/548473) ### Ленивая инициализация - Реализация Singleton в JAVA From ad3935f1d01d2e6c2a4d058f4285d1f9664cd830 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 26 Jan 2020 22:05:23 +0300 Subject: [PATCH 06/11] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2ece5d267..8106e0d6d 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,9 @@ Вычекать этот проект: ```git clone https://github.com/JavaOPs/masterjava.git``` +> - [Настройка git на свой репозиторий](https://github.com/JavaOPs/basejava/blob/master/lesson/lesson1.md#настройка-проекта) +> - [Правила работы с патчами на проекте](https://github.com/JavaOPs/topjava/wiki/Git) + - Применить оптимизацию к MatrixUtil.singleThreadMultiply - Реализовать метод `MatrixUtil.concurrentMultiply`, позволяющий многопоточно перемножать квадратные матрицы N*N. - Количество дочерних потоков ограничено `MainMatrix.THREAD_NUMBER`. From 6dbaece36a6db22e2f8e473d00445af7f41d6873 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Sun, 19 Jul 2020 01:45:25 +0300 Subject: [PATCH 07/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8106e0d6d..74a3603a3 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ - Computer Science Center, курс Параллельное программирование - Юрий Ткач, курс Advanced Java - Concurrency - Головач, курс Java Multithreading - +- [Перевод «Java Memory Model»](https://habr.com/ru/post/510454/) --- ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Задание первого занятия From 88d74d0458d1e2130180ce012a0fd9ca43847479 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Wed, 24 Feb 2021 16:01:58 +0300 Subject: [PATCH 08/11] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 74a3603a3..3f514ad05 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ - Использование ThreadLocal переменных - Николай Алименков — Прикладная многопоточность - Can thread switching happen in the synchronized block? +- [Реактивное программирование - как, зачем и стоит ли?](https://habr.com/ru/company/oleg-bunin/blog/543386/) #### Tproger: Многопоточное программирование в Java 8 - 1. Параллельное выполнение кода с помощью потоков From a4221746bdff9a64edb15f6d141752fa4b96ef51 Mon Sep 17 00:00:00 2001 From: Java Online Projects Date: Fri, 26 Nov 2021 12:47:33 +0300 Subject: [PATCH 09/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f514ad05..e255ebddb 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ > правка к видео: `22: completionService.submit(..)` ### ![](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Все изменения в проекте будут делаться на основе патчей -#### Скачайте [1_1_MailService.patch](https://drive.google.com/open?id=0B9Ye2auQ_NsFTE5ZV3pzWElxTWM), положите его в проект, правой мышкой на нем сделайте Apply Patch ... +#### Скачайте [1_1_MailService.patch](https://drive.google.com/file/d/0B9Ye2auQ_NsFTE5ZV3pzWElxTWM/view?resourcekey=0-TF7H5aadPlE3aQukNC5Ejg), положите его в проект, правой мышкой на нем сделайте Apply Patch ... ---------------------------- - [Как сделать Java код проще и нагляднее](https://habrahabr.ru/company/wrike/blog/349652/) From 205a21d1ba78382ca785d6cc946f1423de93b01b Mon Sep 17 00:00:00 2001 From: Roman Zinnatov Date: Thu, 19 May 2022 14:00:34 +0500 Subject: [PATCH 10/11] prepare to HW1 --- .../masterjava/service/MailService.java | 72 ++++++++++++++++++- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/service/MailService.java b/src/main/java/ru/javaops/masterjava/service/MailService.java index 2b6aeb294..cef46e55e 100644 --- a/src/main/java/ru/javaops/masterjava/service/MailService.java +++ b/src/main/java/ru/javaops/masterjava/service/MailService.java @@ -1,8 +1,10 @@ package ru.javaops.masterjava.service; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.*; +import java.util.stream.Collectors; public class MailService { private static final String OK = "OK"; @@ -11,10 +13,74 @@ public class MailService { private static final String INTERRUPTED_BY_TIMEOUT = "+++ Interrupted by timeout"; private static final String INTERRUPTED_EXCEPTION = "+++ InterruptedException"; + private final ExecutorService mailExecutor = Executors.newFixedThreadPool(8); + public GroupResult sendToList(final String template, final Set emails) throws Exception { - return new GroupResult(0, Collections.emptyList(), null); - } + final CompletionService completionService = new ExecutorCompletionService<>(mailExecutor); + + List> futures = emails.stream() + .map(email -> completionService.submit(() -> sendToUser(template, email))) + .collect(Collectors.toList()); + return new Callable() { + private int success = 0; + private List failed = new ArrayList<>(); + + @Override + public GroupResult call() { + while (!futures.isEmpty()) { + try { + Future future = completionService.poll(10, TimeUnit.SECONDS); + if (future == null) { + return cancelWithFail(INTERRUPTED_BY_TIMEOUT); + } + futures.remove(future); + MailResult mailResult = future.get(); + if (mailResult.isOk()) { + success++; + } else { + failed.add(mailResult); + if (failed.size() >= 5) { + return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); + } + } + } catch (ExecutionException e) { + return cancelWithFail(e.getCause().toString()); + } catch (InterruptedException e) { + return cancelWithFail(INTERRUPTED_EXCEPTION); + } + } +/* + for (Future future : futures) { + MailResult mailResult; + try { + mailResult = future.get(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + return cancelWithFail(INTERRUPTED_EXCEPTION); + } catch (ExecutionException e) { + return cancelWithFail(e.getCause().toString()); + } catch (TimeoutException e) { + return cancelWithFail(INTERRUPTED_BY_TIMEOUT); + } + if (mailResult.isOk()) { + success++; + } else { + failed.add(mailResult); + if (failed.size() >= 5) { + return cancelWithFail(INTERRUPTED_BY_FAULTS_NUMBER); + } + } + } +*/ + return new GroupResult(success, failed, null); + } + + private GroupResult cancelWithFail(String cause) { + futures.forEach(f -> f.cancel(true)); + return new GroupResult(success, failed, cause); + } + }.call(); + } // dummy realization public MailResult sendToUser(String template, String email) throws Exception { From f77a11784d14489a1ff4c8ef6f579d9e151c9ad4 Mon Sep 17 00:00:00 2001 From: Roman Zinnatov Date: Thu, 19 May 2022 15:57:54 +0500 Subject: [PATCH 11/11] Optimize MatrixUtil.singleThreadMultiply --- .../javaops/masterjava/matrix/MatrixUtil.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java index 80a344ac2..f64abfbcd 100644 --- a/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java +++ b/src/main/java/ru/javaops/masterjava/matrix/MatrixUtil.java @@ -18,19 +18,30 @@ public static int[][] concurrentMultiply(int[][] matrixA, int[][] matrixB, Execu return matrixC; } - // TODO optimize by https://habrahabr.ru/post/114797/ public static int[][] singleThreadMultiply(int[][] matrixA, int[][] matrixB) { final int matrixSize = matrixA.length; final int[][] matrixC = new int[matrixSize][matrixSize]; - for (int i = 0; i < matrixSize; i++) { + + int[] thatColumn = new int[matrixSize]; + + try { for (int j = 0; j < matrixSize; j++) { - int sum = 0; for (int k = 0; k < matrixSize; k++) { - sum += matrixA[i][k] * matrixB[k][j]; + thatColumn[k] = matrixB[k][j]; + } + for (int i = 0; i < matrixSize; i++) { + int[] thisRow = matrixA[i]; + int sum = 0; + + for (int k = 0; k < matrixSize; k++) { + sum += thisRow[k] * thatColumn[k]; + } + matrixC[i][j] = sum; + } - matrixC[i][j] = sum; } + } catch (IndexOutOfBoundsException ignored) { } return matrixC; }