Лабы Павловский 2018 / ООП ЛР 8
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра вычислительной техники
отчет
по лабораторной работе №8
по дисциплине «Объектно-ориентированное программирование»
Тема: «Организация многопоточных приложений»
Студент гр. 6307 |
|
Лазарев С. О. |
Преподаватель |
|
Павловский М. Г. |
Санкт-Петербург
2018
СОДЕРЖАНИ
ЦЕЛЬ 3
ЗАДАНИЕ 3
ИСХОДНЫЙ И ОТРЕДАКТИРОВАННЫЙ XML - ФАЙЛЫ 4
СКРИНШОТ ПОСТРОЕННОГО ОТЧЕТА 5
ТЕКСТ ДОКУМЕНТАЦИИ JAVADOC 6
ВЫВОДЫ 6
ИСХОДНЫЙ КОД 7
ЦЕЛЬ 3
ЗАДАНИЕ 3
РАСПЕЧАТКИ СОДЕРЖИМОГО ФАЙЛОВ С ДАННЫМИ 4
СКРИНШОТЫ ШАБЛОНОВ JASPER STUDIO 5
РАСПЕЧАТКИ СГЕНЕРИРОВАННЫХ ФАЙЛОВ 6
ТЕКСТ ДОКУМЕНТАЦИИ JAVADOC 7
Method Detail 7
ВЫВОДЫ 7
ИСХОДНЫЙ КОД 8
ЦЕЛЬ 3
ЗАДАНИЕ 3
ИСХОДНЫЙ И ОТРЕДАКТИРОВАННЫЙ XML - ФАЙЛЫ 4
СКРИНШОТ ПОСТРОЕННОГО ОТЧЕТА 5
ТЕКСТ ДОКУМЕНТАЦИИ JAVADOC 6
ВЫВОДЫ 6
ИСХОДНЫЙ КОД 7
ЦЕЛЬ
Знакомство с правилами и классами построения параллельных приложений в языке Java.
ЗАДАНИЕ
Описать 3 параллельных потока, 1 поток будет загружать данные из XML-файла в экранную форму, 2 поток – редактировать данные и формировать XML-файл для отчета, а 3 поток – строить отчет в HTML-формате. 2 поток не должен формировать XML-файл для отчета, пока 1 поток не загрузит данные в экранную форму, а 3 поток не должен формировать отчет, пока 2 поток редактирует данные и записывает их в XML-файл.
ИСХОДНЫЙ И ОТРЕДАКТИРОВАННЫЙ XML - ФАЙЛЫ
Исходный и отредактированный файлы представлены на рисунках 1, 2.
Рис. 1. Исходный файл
Рис. 2. Отредактированный файл
СКРИНШОТ ПОСТРОЕННОГО ОТЧЕТА
Скриншот представлен на рисунке 3.
Рис. 3. Отчет
ТЕКСТ ДОКУМЕНТАЦИИ JAVADOC
-
t1
java.lang.Thread t1
Поток 1 отвечает за загрузку данных из XML-файла в экранную форму
-
t2
java.lang.Thread t2
Поток 2 отвечает за редактирование данных и сохранение XML-файла
-
t3
java.lang.Thread t3
Поток 3 отвечает за формирование отчета
(package private) java.lang.Thread |
t1 |
Поток 1 отвечает за загрузку данных из XML-файла в экранную форму |
(package private) java.lang.Thread |
t2 |
Поток 2 отвечает за редактирование данных и сохранение XML-файла |
(package private) java.lang.Thread |
t3 |
Поток 3 отвечает за формирование отчета |
ВЫВОДЫ
В данной лабораторной работе я познакомился с правилами и классами построения параллельных приложений в языке Java.
ИСХОДНЫЙ КОД
/** * Поток 1 отвечает за загрузку данных из XML-файла в экранную форму */ Thread t1 = new Thread(); /** * Поток 2 отвечает за редактирование данных и сохранение XML-файла */ Thread t2 = new Thread(); /** * Поток 3 отвечает за формирование отчета */ Thread t3 = new Thread();
t1 = new Thread(() -> { JOptionPane.showMessageDialog(window, "1 поток начал работу"); loadXML(); dataEmploy.setRowSelectionInterval(0,0); try { Thread.sleep(6000); } catch (InterruptedException ex) { ex.printStackTrace(); } SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(window, "1 поток закончил работу."); }); }); t1.start();
t2 = new Thread(() -> { if (t1.isAlive()) { try { log.info("Ожидание завершения 1 потока"); JOptionPane.showMessageDialog(window, "Ждем, пока отработает 1 поток"); t1.join(); JOptionPane.showMessageDialog(window, "1 поток отработал, пробуем запустить 2 поток"); } catch (InterruptedException ex) { log.fatal("Join doesn't work"); ex.printStackTrace(); } } if (model.getRowCount() != 0) { if (dataEmploy.getSelectedRow() != -1) { JOptionPane.showMessageDialog(null,"2 поток запущен"); dialog = new EditDialogEmploy(window, employs.this, "Редактирование"); dialog.setVisible(true); try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printStackTrace(); } } else { log.error("Не выбрана строка"); JOptionPane.showMessageDialog(null, "Не выбрана строка. Нечего редактировать"); } } else { log.error("В данном окне нет записей"); JOptionPane.showMessageDialog(null, "В данном окне нет записей. Нечего редактировать"); } }); t2.start();
t3 = new Thread(() -> { if (t2.isAlive()) { try { JOptionPane.showMessageDialog(window, "Ждем, пока отработает 2 поток"); t2.join(); JOptionPane.showMessageDialog(window, "2 поток отработал"); } catch (InterruptedException ex) { ex.printStackTrace(); } } if (model.getRowCount() != 0) { JOptionPane.showMessageDialog(null, "3 поток создает отчет"); try { Thread.sleep(5000); } catch (InterruptedException ex) { ex.printStackTrace(); } print("dataEmploy.xml", "window/dataEmploy", "Cherry.jrxml", "otchet.html"); } }); t3.start();
Другой вариант
class myThread extends Thread{ private int type; public myThread(int i) { type=i; } public void run() { if (type==1) { synchronized (shared) { try { shared.wait(); } catch (InterruptedException e) { e.printStackTrace(); } try { loadXML(); dataEmploy.setRowSelectionInterval(0,0); } catch (Exception e1) { e1.printStackTrace(); } } } if (type==2) { synchronized (shared) { shared.notifyAll(); try { shared.wait(); } catch (InterruptedException e) { e.printStackTrace(); } dialog = new EditDialogEmploy(window, employs.this, "Редактирование"); dialog.setVisible(true); shared.notifyAll(); } } if (type==3) { synchronized (shared) { shared.notifyAll(); try { shared.wait(); } catch (InterruptedException e) { e.printStackTrace(); } print("dataEmploy.xml", "window/dataEmploy", "Cherry.jrxml", "otchet.pdf"); } } } } new myThread(1).start(); new myThread(2).start(); new myThread(3).start(); });