- •Основы объектно-ориентированного программирования
- •Оглавление
- •Тема 1. Введение в предмет и содержание дисциплины 4
- •Теоретический раздел
- •Тема 1. Введение в предмет и содержание дисциплины
- •Особенности Java
- •Комментарии
- •Ключевые слова
- •Литералы
- •Установка Java в переменных окружениях
- •Некоторые из особенностей элементов Java
- •Символы, строки и идентификаторы
- •Разделители
- •Операции
- •Основные приложения Java
- •Метод update()
- •Требование перерисовки
- •Тема 3. Введение в классы java. Методы и классы. Классы и наследование в java. Пакеты и интерфейсы Введение в классы Java
- •Синтаксис определения экземпляра класса
- •Модификаторы класса
- •Конструкторы
- •Ограничение доступа к элементам класса
- •Статические переменные и методы
- •Абстрактные методы
- •Методы final
- •Область видимости переменных
- •Переменные this и super
- •Тема 4. Основы ввода/вывода. Работа со строковыми данными Работа со строками
- •Потоки ввода-вывода информации
- •Байтовые и символьные потоки
- •Классы байтовых потоков
- •Классы символьных потоков
- •Предопределённые потоки
- •Тема 5. Работа с файлами Классы FileInputStream и FileOutputStream
- •Класс File
- •Класс RandomAccessFile
- •Тема 6. Методы и средства обработки исключений Методы и средства обработки исключений
- •Тема 7. Разработка апплетов, работа с графикой
- •Пакет awt
- •Класс Applet
- •Инициализация и завершение апплета
- •Запуск апплетов
- •Рисование линий в апплете
- •Рисование прямоугольников в апплете
- •Рисование эллипсов и кругов в апплете
- •Рисование дуг в апплете
- •Работа с цветом
- •Тема 8. Многопоточное программирование Интерфейсы в Java
- •Многопоточное программирование
- •Организация потоков
- •Создание нового потока
- •Тема 9. Разработка пользовательского интерфейса с использованием фреймов, элементов управления
- •События
- •Классы событий
- •Класс ActionEvent
- •Элементы-источники событий
- •Интерфейсы прослушивания событий
- •Классы пакета awt: Component, Window, Frame
- •Элементы управления Label, Button, Checkbox, Choice, List, Scrollbar
- •Элементы управления TextField и TextArea
- •Диалоговые окна
- •Контроль знаний Индивидуальная практическая работа № 1. «Объекты и классы»
- •Индивидульная практическая работа № 2. «Наследование и скрытие данных. Абстрактные классы и интерфейсы»
- •Контрольная работа № 1. «Работа с файлами»
- •Контрольная работа № 2. «Разработка пользовательского интерфейса с использованием фреймов, элементов управления»
- •Список использованных источников
Организация потоков
Диапазон приоритетов потоков определяется: MIN_PRIORITY – 1 и MAX_PRIORITY – 10. По умолчанию приоритет потока равен 5. При запуске main-функции её приоритет по умолчанию равен 5.
Один из потоков (главный или родительский) начинает выполняться первым при запуске Java-программы. От главного потока определяются дочерние потоки. Главный поток начинает выполняться первым и заканчивает выполнятся последним. Программа завершается, когда главный поток останавливается.
Поток может быть создан на основе базового класса Thread или реализации интерфейса Runnable. Класс Thread инкапсулирует ряд методов, которые помогают управлять потоками. Главный поток создаётся автоматически с именем main и приоритетом 5 по умолчанию. Им можно управлять через объект класса Thread. Ссылку на него можно получить, используя статический метод:
static currentThread( ).
Пример:
Thread th = Thread.currentThread( ); /*возвращает ссылку на
поток, в котором он вызывается. В
дальнейшем эту объектную ссылку
можно использовать для вызова
методов управления потоками */
Создание нового потока
Самый простой способ создания потока – это реализация интерфейса Runnable, внутри которого определен единственный метод : public void run(). При создании потока (при реализации интерфейса Runnable) в классе требуется реализация метода run():
class A implements Runnable
{ ….
run();
……}
Пример: класс, реализующий многопоточность
class NewThread implements Runnable
{Thread t;
NewThread (); //конструктор для создания нового потока
{ t = new Thread(this, “DemoThread”);
System.out.println(“Дочерний поток ”+t);
t.start(); //стартовать поток
}
public void run()
{ try { for(int i=3; i>0; i--)
{ System.out.println(“Дочерний поток: ”+i);
Thread.sleep(500); //приостановить поток на 500 мс
}
}
catch(Exception e)
{ System.out.println(“Прерывание дочернего потока”);}
System.out.println(“Завершение дочернего потока ”);
} }
//головная программа
class ThreadDemo
{ public static void main(String args[])
{ new NewThread ();
try { for(int i=3; i>0; i--)
{ System.out.println(“Главный поток “);
Thread.sleep(500);
}
}
catch(Exception e)
{ System.out.println(“Прерывание главного потока”);}
System.out.println(“Завершение главного потока ”);
} }
Вывод программы:
Дочерний поток: Thread [DemoThread, 5, main]
Главный поток 3
Дочерний поток 3
Дочерний поток 2
Главный поток 2
Дочерний поток 1
Завершение дочернего потока
Главный поток 1
Завершение главного потока
За счет расчета величины паузы 1000 и 500 мс обеспечивается завершение главного потока после дочернего.
Синхронизация предназначена для разграничения и упорядочивания доступа нескольких потоков к разделяемому ресурсу (напр., таблица БД, файл, статическая переменная).
Обычно в языках программирования распараллеливание и синхронизация реализуется программированием цикла событий и опросом некоторых разделяемых переменных на выполнение какого-то условия, на что теряется время процессора.
В Java такая возможность обеспечивается на уровне семафора, используемого для взаимоисключающей блокировки на критических участках программы. Синхронизация кода реализуется двумя основными способами:
1) синхронизация метода – если критическим участком является метод, то можно просто указать ключевое слово synchronized.
Пример:
synchronized void myMethod()
{……}
или
void myMethod()
{ synchronized(this)
{…….}
}
2)синхронизация объекта – если нет доступа к классу, в котором объявлен метод, то для его синхронизации можно использовать следующий приём:
synchronized(Object)
{ //операторы критического участка, в том числе и вызовы метода
}
Здесь Object – ссылка на объект, который нужно синхронизировать, то есть объект, элементом которого является вызываемый метод.
Если какой-либо из потоков начнет выполнять участок кода, определенный как synchronized, то для других потоков этот участок будет заблокирован до освобождения его первым потоком.
