ОСИС Мади Мезенцев. Потоки Java. Вычисление минимума и максимума
Скачать 79.5 Kb.
|
Кафедра Автоматизированных систем управления Контрольная работа На тему: «Потоки Java. Вычисление минимума и максимума» Студент Коломиец М.В. Преподаватель Мезенцев К.Н. Москва 2019 Постановка задачи Дана последовательность чисел: 1000,5,450,8,4,89,12,10,45,23,12,9,21,1,7 требуется разработать программу с двумя потоками. Потоки работают параллельно, задержка в работе потоков равна одной секунде. Первый поток вычисляет минимум последовательности, второй максимум. По завершении работы потоков вычисляется значение R = max – min. В процессе работы потоков выводится номер итерации обработки последовательности чисел. Для создания потоков использовать интерфейс Runnable. Структура программы показана на рисунке 1. Рис.1. Классы программы Классы программы Исходные данные public class ClassData { double myData[]={-10,5,45,8,-4,8,-10,8,-10,12}; } Вычисление минимального значения class ThreadMin implements Runnable{ String name; Thread t; double min = 0; int idx = 0; ClassData objData; public ThreadMin(String threadname,ClassData obj){ name=threadname; t = new Thread(this, name); System.out.println("Новая нить: " + t); objData = obj; t.start(); } public void run() { try{ idx = 0; min = objData.myData[idx]; for(int i=1;i { if(objData.myData[i] idx = i; min = objData.myData[i]; } System.out.println(t + " : " + i); Thread.sleep(1000); } }catch(InterruptedException e){ System.out.println(name + " нить прервана"); } System.out.println(name + " нить завершилась !"); } } Вычисление максимального значения public class ThreadMax implements Runnable { String name; Thread t; double max=0; int idx = 0; ClassData objData; public ThreadMax(String threadname,ClassData obj){ name=threadname; t = new Thread(this, name); System.out.println("Новая нить: " + t); objData = obj; t.start(); } public void run() { try{ idx = 0; max = objData.myData[idx]; for(int i=1;i { if(objData.myData[i]>max){ idx = i; max = objData.myData[i]; } System.out.println(t + " : " + i); Thread.sleep(1000); } }catch(InterruptedException e){ System.out.println(name + " нить прервана"); } System.out.println(name + " нить завершилась !"); } } Тестирование программы public class Driver{ public static void main(String args[]){ ThreadMax obMax = new ThreadMax ("Max"); System.out.println("Состояние первой нити: "+ obMax.t.isAlive()); try{ System.out.println("Ожидание завершения работы нитей"); obMax.t.join(); }catch (InterruptedException e){ System.out.println("Главный поток прерван!"); } ThreadMin obMin = new ThreadMin("Min"); System.out.println("Состояние второй нити: "+ obMin.t.isAlive()); t.strat(); try{ System.out.println("Ожидание завершения работы нитей"); obMin.t.join(); }catch (InterruptedException e){ System.out.println("Главный поток прерван!"); } if(obMax.t.isAlive() && obMin.t.isAlive()){ System.out.println("idx= "+idx+1+ " max= "+ max); System.out.println("idx= "+idx+1+ " min= "+ min); System.out.println("R(max-min)= "+(max-min)); } } } Результат работы программы Новая нить: Thread[Max,5,main] Thread[Max,5,main] : 1 Новая нить: Thread[Min,5,main] Состояние первой нити: true Состояние второй нити: true Ожидание завершения работы нитей Thread[Min,5,main] : 1 Thread[Min,5,main] : 2 Thread[Max,5,main] : 2 Thread[Min,5,main] : 3 Thread[Max,5,main] : 3 Thread[Max,5,main] : 4 Thread[Min,5,main] : 4 Thread[Max,5,main] : 5 Thread[Min,5,main] : 5 Thread[Min,5,main] : 6 Thread[Max,5,main] : 6 Thread[Min,5,main] : 7 Thread[Max,5,main] : 7 Thread[Min,5,main] : 8 Thread[Max,5,main] : 8 Thread[Max,5,main] : 9 Thread[Min,5,main] : 9 Thread[Min,5,main] : 10 Thread[Max,5,main] : 10 Thread[Min,5,main] : 11 Thread[Max,5,main] : 11 Thread[Max,5,main] : 12 Thread[Min,5,main] : 12 Thread[Max,5,main] : 13 Thread[Min,5,main] : 13 Thread[Max,5,main] : 14 Thread[Min,5,main] : 14 Min нить завершилась ! Max нить завершилась! idx=1 max=1000.0 idx=14 min=1.0 R(max-min)=999.0 |