Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Родин Отчет 3.docx
Скачиваний:
7
Добавлен:
09.02.2015
Размер:
174.14 Кб
Скачать

Министерство образования и науки Российской Федерации

Калужский филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования

«Московский государственный технический университет имени Н.Э. Баумана»

(КФ МГТУ им. Н.Э. Баумана)

ФАКУЛЬТЕТ

"Фундаментальные науки"

КАФЕДРА

"Программное обеспечение ЭВМ, информационные технологии и прикладная математика"

О Т Ч Е Т

Лабораторная работа №3

ДИСЦИПЛИНА:

"Основы научных исследований"

ТЕМА:

"ПОТОКИ, БАЗЫ ДАННЫХ, SWING, ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС "

Выполнил: студент гр. ИТД.Б-61

Родин С.Е. ______________________

Проверил:

Димитрюк О.В.___________________

Дата сдачи (защиты) лабораторной работы:

Результаты сдачи (защиты):

Количество рейтинговых баллов

Оценка

Калуга, 2014

Цель

Изучить основы работы с потоками выполнения приложения, базами данных, компонентами Swing создания пользовательского интерфейса. Ознакомиться на практике с реализацией механизмов работы с базами данных, создания простейшего интерфейса пользователя.

Задачи

  • Изучить теоретический материал.

  • Настроить рабочее окружение.

  • Выполнить задание согласно выданному варианту.

  • Ответить на вопросы для самоконтроля.

  • Подготовить отчет.

  • Защитить лабораторную работу.

Задание

Вариант 2

  • Создать матрицу большого размера, заполнить ее случайными действительными числами и сохранить в файл. Заполнение матрицы случайными числами необходимо выполнить двумя способами: 1) с использованием одного потока; 2) с использованием двух и более потоков (количество потоков может меняться). Сравнить время генерации матрицы в обоих случаях.

  • Необходимо разработать приложение для учета компакт-дисков в музыкальном салоне. Приложение должно позволять пользователю просматривать, добавлять, изменять и удалять информацию о дисках. Описание диска должно содержать следующие поля: идентификатор (id), жанр, исполнитель, название, год. Необходимо обеспечить отображение списка дисков в виде таблицы и возможность просмотра дисков по жанру, выбранному пользователем из выпадающего списка.

Теоретические сведения

В Java термин “поток” может обозначать две разные вещи:

  • Экземпляр класса java.lang.Thread

  • Поток выполнения

Экземпляр Thread – это обычный объект. Подобно другим объектам в Java, он имеет переменные и методы, а живет и умирает в куче. Поток выполнения (thread of execution) – это отдельный процесс (“легковесный” процесс), имеющий свой собственный стэк вызовов. В Java для каждого потока существует один стэк вызовов. Даже если вы явно не создаете потоков в вашей программе, они там все равно есть.

Метод main(), например, выполняется в потоке, который называется “главным” (main thread), и если вы посмотрите на стэк вызовов, то увидите, что метод main() стоит первым в стеке, т.е. находится в самом низу.

Создание потоков

Поточность в Java начинается с создания экземпляра java.lang.Thread. В этом классе мы найдем методы для управления потоками: для создания, запуска, и приостановки потоков. Следующие методы самые популярные:

  • start()

  • yield()

  • sleep()

  • run()

Весь код происходит в методе run(). В него помещается код, который требуется выполнить в отдельном потоке.

public void run() {

// код для выполнения в отдельном потоке

}

Из метода run() конечно же можно вызывать другие методы, а так как для отдельного потока создался новый стэк вызовов, то в этом новом стеке, первым методом будет метод run(). А где нам разместить метод run()? Определить и инстанциировать поток можно двумя способами:

  • Расширить класс java.lang.Thread

  • Реализовать интерфейс Runnable

Предпочтительным способом является реализация интерфейса Runnable. Расширить Thread – это просто, но этот способ не является хорошей практикой ООП. Почему? Потому что в Java нет множественного наследования и расширяя Thread, вы не можете сделать этот класс подклассом другого класса. Поэтому, лучше всего разработать класс, который реализует интерфейс Runnable.

Расширение java.lang.Thread

Простейший путь определить поток – расширить Thread, переопределить метод run() и поместить в нем весь код, который нужно выполнить в отдельном потоке:

package ru.topcode.threadomaniac;

 

public class MyThread extends Thread {

 

@Override

public void run() {

System.out.println("Очень важная работа выполняется в MyThread");

}

}

Реализация интерфейса java.lang.Runnable

Реализация интерфейса Runnable дает возможность расширить любой другой класс и в то же время определить поведение, которое будет выполняться в отдельном потоке.

package ru.topcode.threadomaniac;

 

class MyRunnable implements Runnable {

 

@Override

public void run() {

System.out.println("Очень важная работа выполняется в MyRunnable");

}

}

Инстанцирование потока

Каждый поток начинается с создания экземпляра Thread. Независимо от того, расширяли вы Thread или реализовывали Runnable, для выполнения работы, нужно иметь экземпляр Thread.

Если вы расширили класс Thread, то инстанцирование выполняется также как инстанцирование обычного объекта:

MyThread t = new MyThread();

Если вы реализовывали Runnable, вам все равно придется создать экземпляр класса Thread.

MyRunnable r = new MyRunnable();

Thread t = new Thread(r);

Объяснить это можно так: вместо того, чтобы комбинировать в одном классе и поток и выполняемую работу (код), мы разделяем логику на два класса – класс Thread для потоко-зависимого кода и реализация Runnable для описания работы, которая должна выполняться в отдельном потоке. Другими словами: Thread – это работник, а Runnable – это работа.

Один экземпляр Runnable можно передать нескольким объектам Thread:

Кроме конструктора по умолчанию и конструктора, принимающего экземпляр Thread, в классе Thread есть и другие перегруженные конструкторы. Вот список всех конструкторов Thread:

  • Thread()

  • Thread(String name)

  • Thread(Runnable runnable)

  • Thread(Runnable runnable, String name)

  • Thread(ThreadGroup g, Runnable runnable)

  • Thread(ThreadGroup g, Runnable runnable, String name)

  • Thread(ThreadGroup g, String name)

  • Вот наглядное представление того, что происходит со стеками во время работы многопоточного приложения:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]