Добавил:
github.com Кофедра ВТ-помойка Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
14.11.2018
Размер:
110.77 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра вычислительной техники

отчет

по лабораторной работе №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(); });

Соседние файлы в папке Лабы Павловский 2018