Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2015, 17:46   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Задача на многопоточность

Добрых суток уважаемые форумчане. Столкнулся с такой задачей:
Написать multithread функцию, получающую в качестве аргументов «n x n» массив «a» вещественных чисел, целое число «n», номер нити (thread) «k», общее количество нитей (threads) «p», и возвращающую ненулевое значение, если массив «а» симметричен (т.е. «aij»= «aji»), 0 в противном случае. При этом должна быть обеспечена равномерная загрузка всех задач. Основная программа должна вводить числа «p», «n» и массив «а» (из файла или по заданной формуле), запускать задачи, вызывать эту функцию и выводить на экран результат её работы.
Написал код с одним основным потоком и задумался…
Код:
import java.util.Random;
import java.util.Scanner;

class Massiv {
    // Проверяем на симетричность
    public int simetr (double [] [] a){
        for (int i=0; i<4; i++){
            for (int j=i+1; j<4; j++){
                if (a[i][j]!=a[j][i]) return 0; 
            }
        }
        return 1;
    }
 }
public class JavaApplication2 {
    public static void main(String[] args) {
       // Создаем массив и заполняем его случайными числами
       Random rand=new Random(); 
       int n;
       Scanner in = new Scanner(System.in);
       System.out.println("Введите размер массива");
       n = in.nextInt();
       double [][] b = new double [n][n];
       for (int i=0; i<n; i++)
           for (int j=0; j<n; j++){
               b[i][j]=rand.nextDouble(); 
           }
        // Выводим  полученный массив
        for (int i=0; i<n; i++){
           for (int j=0; j<n; j++){
               System.out.print(b[i][j] + " ");
           }
           System.out.println();
        }
        // Проверяем на симетричность
        Massiv ob=new Massiv(); 
        if (ob.simetr(b)!=0)
            System.out.println("Массив симетричен"); 
        else
            System.out.println("Массив не симетричен");
      }
 }
Ума не приложу куда здесь прикрутить потоки, а главное зачем они тут нужны. Но тем не менее вроде как имеется красивое гармоничное решение задачи, просто надо подумать. Подскажите пожалуйста в каком направлении мыслить!
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 22.11.2015, 18:18   #2
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Условие задачи многое не договаривает по конечным требованиям к программе.
Но смею предположить подобный вариант:
- вы задаете конечное число потоков (то самое k по условию)
- вы задаете сам массив и указываете номер потока (номер потока здесь понимается именно в контексте вашей задачи, допустим, что это число от 1 до k), в котором желаете проверить его симметричность.
- при необходимости, задаете иной массив и номер потока для него.
В конечном счете, основная идея вашей программы будет сводиться к тому, что вы должны правильно распределить нагрузку между потоками. Вы должны учитывать, к примеру, что если поступил массив для вычисления в поток p, а этот поток сейчас занят, то по возможности, вам необходимо провести вычисления в другом потоке, при условии, что таковой имеется и он свободен в данный момент.
Базиля вне форума Ответить с цитированием
Старый 22.11.2015, 18:35   #3
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Вообще ощущение, что эту задача вырвана из контекста другой задачи, меня попросила посмотреть ее одна очаровательная девушка, я сначала посмотрел и сказал хрень какаято ты не правильно условие сформулировала, на что она принесла задание на бумаге откуда я все и переписал.
То есть задаем массив и номер потока который будет проверять непосредственно этот массив, если поток занят, то массивом занимается другой поток. Я правильно понял вашу идею?
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 22.11.2015, 18:46   #4
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
То есть задаем массив и номер потока который будет проверять непосредственно этот массив, если поток занят, то массивом занимается другой поток. Я правильно понял вашу идею?
Если таковой поток имеется.
Да, я именно так эту задачу и понимаю.
Но здесь что-то действительно не договаривают.
Как вообще хотят задавать исходные данные?
К примеру, через файл или ввод с клавиатуры.
В зависимости от выбранного способа задания исходных данных, немного будет отличаться алгоритм работы вашего главного потока, который, к примеру, возьмет на себя обязательство вывода результатов вычисления другими потоками.
Если все из файла - это будет даже проще. Оговорили формат данных хранящихся в этом файле. Распределили массивы по потокам и ожидаем пока они закончат вычисления. Далее выводим на экран результаты.
А если ввод с клавиатуры, то здесь поинтересней. Главный поток висит в ожидании операции ввода/вывода. Посему, нужно решить, как ему выводить данные о вычислениях в потоках.
Базиля вне форума Ответить с цитированием
Старый 22.11.2015, 18:50   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Спасибо за помощь. Другого варианта я тоже не вижу.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность ETUN4 Общие вопросы Delphi 1 22.08.2015 21:17
С++ многопоточность kineziz Общие вопросы C/C++ 3 11.09.2012 13:20
многопоточность blacktener Общие вопросы по Java, Java SE, Kotlin 1 25.07.2012 13:18
Многопоточность в C Ryabinin313 Общие вопросы C/C++ 2 30.10.2011 18:02
Многопоточность JakSon Общие вопросы Delphi 10 27.12.2009 02:19