Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 14
1

Получить результат из потока в главный поток

16.06.2016, 23:22. Показов 3327. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер. Я только начинаю изучать многопоточность, столкнулся со следующей задачей:
"Задана матрица действительных чисел. Найти номер строки матрицы с максимальной суммой элементов. Вычисление сумм элементов по строке матрицы оформить в виде отдельных потоков."
То есть, если я правильно понял, то каждая строка = один новый поток, после чего, когда в каждом потоке будет посчитана сумма элементов строки, мне нужно эти значения сумм получить в главный поток и там уже найти максимум.
Потоки создаю с помощью интерфейса Runnable.
А вот как потом вернуть значение я что-то не понимаю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2016, 23:22
Ответы с готовыми решениями:

Как получить результат переменной из другого потока
Потоки создаются при подключении нового пользователя. В потоке выполняются различные функции, а...

Приостановить главный поток до закрытия формы
В общем не могу понять, как сделать так, чтоб поток main тормозился, пока не закроется форма ...

Как передать данные из дочерного потока в главный поток
Здравствуйте. Искал по форуму есть похожие темы но нет решения. Есть класс который загружает данные...

Передача объекта обратно в главный поток из другого потока
Добрый день. У меня ест фрагмент в котором я запускаю новый поток, после этого я хочу вернуть...

7
63 / 63 / 58
Регистрация: 19.01.2016
Сообщений: 152
16.06.2016, 23:46 2
Создай массив типа ExecutorService

Java
1
2
3
4
5
ExecutorService[] executors = new ExecutorService[matrix.length];
for(int i = 0; i < executors.length; i++){
     executors[i] = Executors.newSingleThreadExecutor();
     executoes[i].execute(yourRunnable);
}
и из него по индексу возвращай значение
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.06.2016, 00:11 3
Поскольку готоволю материал для лекции введения в джаву 8, оставлю тут решение этой задачи в функциональном стиле. ТСу такое решение сдавать не советую т.к препод если и поймет его, то вряд ли поверит что это вы сами написали

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.stream.IntStream;
 
public class Solution {
 
    private static final int MATRIX_SIZE = 500;
    
    private static Random random = new Random();
 
    public static void main(String[] args) throws Exception {
        int[][] matrix = generateMatrix(MATRIX_SIZE, MATRIX_SIZE);
 
        List<CompletableFuture<Integer>> rowFutures = new ArrayList<>();
        IntStream.range(0, matrix.length).forEach(i -> rowFutures.add(CompletableFuture.supplyAsync(() -> IntStream.of(matrix[i]).max().getAsInt())));
        int max = rowFutures.stream().max(Solution::compareForMaxValue).get().get();
        
        System.out.println("Max: " + max);
 
    }
 
    private static int compareForMaxValue(CompletableFuture<Integer> o1, CompletableFuture<Integer> o2) {
        try {
            return o1.get().compareTo(o2.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
            return -1;
        }
    }
 
    private static int[][] generateMatrix(int h, int w) {
        int[][] matrix = new int[h][w];
        IntStream.range(0, h).forEach(i -> matrix[i] = random.ints(w, 0, Integer.MAX_VALUE).toArray());
        return matrix;
    }
}
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 14
17.06.2016, 18:52  [ТС] 4
Мне не нужно никому это сдавать. Задачки для себя).
И интересуют именно как обстоят дела с потоками. Попробую с массивом ExecutorService.
Просто читаю Шилдта Java 2, и там про такие вещи не рассказал он.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.06.2016, 20:18 5
vlad-crash, если для себя, то мой пример это пример как таке делают на 8ой джаве. В книгах обычно рассматривают более ранние версии языка
0
0 / 0 / 0
Регистрация: 29.02.2016
Сообщений: 14
17.06.2016, 22:00  [ТС] 6
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
vlad-crash, если для себя, то мой пример это пример как таке делают на 8ой джаве. В книгах обычно рассматривают более ранние версии языка
А если вообще смысл продолжать изучать устаревшую версию языка? Просто я это начал, чтобы дальше начать изучать и понимать Донн Фелкера или Эд бурнета про разработку мобильный приложений на Андроид.
0
Эксперт Java
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.06.2016, 01:12 7
vlad-crash, насчет мобильных приложений и что у них там актуально лучше спросить в соотв. разделе.
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
19.06.2016, 09:02 8
Цитата Сообщение от Николай Б Посмотреть сообщение
Создай массив типа ExecutorService
Не нужен тут массив вообще. Создаёшь один ExecutorService на нужное количество потоков. И в него передаёшь свои экземпляры Runnable.

Кликните здесь для просмотра всего текста
Количество потоков в сервисе не обязательно должно равняться количеству строк в матрице.
2
19.06.2016, 09:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2016, 09:02
Помогаю со студенческими работами здесь

Получение значения из фонового потока и передача его в главный поток
как получить значение из фонового потока и передать его в главный поток?Знаю что метод должен быть...

Биндинг в потоке: поток не может получить доступ к интерфейсу из другого потока
модераторам: тема про C# а не UI, так что не переносите &gt;.&lt; Вопрос к знатокам как сделать биндиг...

Главный поток и вторичный
1. При нажатии на кнопку Start в новом потоке запускается server.AcceptTcpClient() (который...

BackgroundWorker блокирует главный поток
Подскажите как поправить. Код копирует файлы отмеченные галочками в ListView, увеличивает значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru