Скачать презентацию Основы ООП Практикум Панов Александр Игоревич Московский физико-технический Скачать презентацию Основы ООП Практикум Панов Александр Игоревич Московский физико-технический

Практикум_презентация(1).ppt

  • Количество слайдов: 97

Основы ООП. Практикум Панов Александр Игоревич Московский физико-технический институт Основы ООП. Практикум Панов Александр Игоревич Московский физико-технический институт

Семинар 1. TIOBE Index http: //www. tiobe. com/index. php/content/paperinfo/tpci/index. html 01. 02. 2018 2 Семинар 1. TIOBE Index http: //www. tiobe. com/index. php/content/paperinfo/tpci/index. html 01. 02. 2018 2

Семинар 1. ООП на примере языка Java n n n C 1995 г. 5 Семинар 1. ООП на примере языка Java n n n C 1995 г. 5 версий – последняя JDK 1. 7 Поддержка Sun – Oracle http: //docs. oracle. com/javase/7/docs/ Программы транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) Сборка мусора garbage collector (GC) Java. SE, Java. EE, Java. FX, Android Ориентация на web и mobile 01. 02. 2018 3

Семинар 1. Компоненты языка Java 01. 02. 2018 4 Семинар 1. Компоненты языка Java 01. 02. 2018 4

Семинар 1. Лексика языка. Кодировка Unicode - u 1 B 05 n Пробелы, комментарии, Семинар 1. Лексика языка. Кодировка Unicode - u 1 B 05 n Пробелы, комментарии, double a = 1, b = 1, c = 6; double D = b * b - 4 * a * c; if (D >= 0) { double x 1 = (-b + Math. sqrt (D)) / (2 * a); double x 2 = (-b - Math. sqrt (D)) / (2 * a); } n int x = 2; int y = 0; /* if (x > 0) y = y + x*2; else y = -y - x*4; */ y = y*y; // + 2*x; 01. 02. 2018 5

Семинар 1. Лексика языка. Ключевые слова и идентификаторы Идентификаторы – это имена, которые даются Семинар 1. Лексика языка. Ключевые слова и идентификаторы Идентификаторы – это имена, которые даются различным элементам языка для упрощения доступа к ним. Имена имеют пакеты, классы, интерфейсы, поля, методы, аргументы и локальные переменные. Computer, COLOR_RED, _, a. Very. Long. Name. Of. The. Method n Ключевые слова – это зарезервированные слова, состоящие из ASCII -символов и выполняющие различные задачи языка. abstract double int strictfp boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile do instanceof static while n 01. 02. 2018 6

Семинар 1. Лексика языка. Литералы и операторы Литералы позволяют задать в программе значения для Семинар 1. Лексика языка. Литералы и операторы Литералы позволяют задать в программе значения для числовых, символьных и строковых выражений, а также null-литералов: q целочисленный (integer) - int, long - 137; q дробный (floating-point) – float, double - 3. 14; q булевский (boolean) – boolean - true; q символьный (character) – char – ‘G’; q строковый (string) – String – “строчка”; q null-литерал (null-literal). n Операторы используются в различных операциях – арифметических, логических, битовых, операциях сравнения и присваивания. = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>>= n 01. 02. 2018 7

Семинар 1. Лексика языка. Пример программы public class Demo { /** * Основной метод, Семинар 1. Лексика языка. Пример программы public class Demo { /** * Основной метод, с которого начинается * выполнение любой Java программы. */ public static void main (String args[]) { System. out. println("Hello, world!"); } } javac Demo. java Demo 01. 02. 2018 8

Семинар 2. ООП. Процедурноориентированная методология n n n Процедурная – алгоритмическая Алгоритм – это Семинар 2. ООП. Процедурноориентированная методология n n n Процедурная – алгоритмическая Алгоритм – это способ решения вычислительных и других задач, точно описывающий определенную последовательность действий, которые необходимо выполнить для достижения заданной цели. Большие задачи разбиваются на подзадачи – процедуры public main(int argc){ printf(“Hello!”); } n n Переиспользование библиотек процедур Модули как совокупности процедур – структурное программирование 01. 02. 2018 9

Семинар 2. ООП. Объекты Гради Буч: Объект - это мыслимая или реальная сущность, обладающая Семинар 2. ООП. Объекты Гради Буч: Объект - это мыслимая или реальная сущность, обладающая характерным поведением и отличительными характеристиками и являющаяся важной в предметной области. Каждый объект имеет состояние, обладает четко определенным поведением и уникальной идентичностью. n n n Состояние: в любой момент времени состояние объекта включает в себя перечень (обычно статический) свойств объекта и текущие значения (обычно динамические) этих свойств. Человек сидит и у него есть удочка. Поведение: для каждого объекта существует определенный набор действий, которые с ним можно произвести. Файл в ОС можно открыть, создать и т. п. Уникальность: в машинном представлении под параметром уникальности объекта чаще всего понимается адрес размещения объекта в памяти; уникальность объекта состоит в том, что всегда можно определить, указывают две ссылки на один и тот же объект или на разные объекты. Даже одинаковые монеты (абсолютно все их атрибуты одинаковы: год выпуска, номинал и т. д. ), они по-прежнему остаются разными монетами. 01. 02. 2018 10

Семинар 2. ООП. Классы n n n Совокупность атрибутов и их значений характеризует объект. Семинар 2. ООП. Классы n n n Совокупность атрибутов и их значений характеризует объект. Все объекты одного и того же класса описываются одинаковыми наборами атрибутов. Все объекты одного и того же класса обладают одинаковым поведением q q n n n Пример 1: разные объекты класса «Монеты» Пример 2: конюшня и лошадь как объекты одного класса Класс имеет имя, которое относится ко всем объектам этого класса. В классе вводятся имена атрибутов, которые определены для объектов (атрибуты=свойства=поля). Класс является шаблоном поведения объектов (методы) Класс может иметь конструктор (constructor) - выполняется при создании объектов. Класс может иметь деструктор (destructor) - выполняется при уничтожении объектов. 01. 02. 2018 11

Семинар 2. ООП. Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего Семинар 2. ООП. Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса). Внутри объекта данные и методы могут обладать различной степенью открытости (или доступности). n n Открытые члены класса составляют внешний интерфейс объекта - это та функциональность, которая доступна другим классам. Закрытыми обычно объявляются все свойства класса, а также вспомогательные методы, которые являются деталями реализации и от которых не должны зависеть другие части системы. Модульность - благодаря сокрытию реализации за внешним интерфейсом класса можно менять внутреннюю логику отдельного класса, не меняя код остальных компонентов системы. 01. 02. 2018 12

Семинар 2. ООП. Наследование (inheritance) - это отношение между классами, при котором класс использует Семинар 2. ООП. Наследование (inheritance) - это отношение между классами, при котором класс использует структуру или поведение другого класса (одиночное наследование), или других (множественное наследование ) классов. Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов. 01. 02. 2018 13

Семинар 2. ООП. Задача Пример: Предположим, мы хотим создать векторный графический редактор, в котором Семинар 2. ООП. Задача Пример: Предположим, мы хотим создать векторный графический редактор, в котором нам нужно описать в виде классов набор графических примитивов - Point, Line, Circle, Box и т. д. У каждого из этих классов определим метод draw для отображения соответствующего примитива на экране. Хотим: Написать код, который при необходимости отобразить рисунок будет последовательно перебирать все примитивы, на момент отрисовки находящиеся на экране, и вызывать метод draw у каждого из них. 01. 02. 2018 14

Семинар 2. ООП. Решение 1. //создание пустого массива, который может // содержать объекты Point Семинар 2. ООП. Решение 1. //создание пустого массива, который может // содержать объекты Point с максимальным // объемом 1000 Point[] p = new Point[1000]; Line[] l = new Line[1000]; Circle[] c = new Circle[1000]; Box[] b = new Box[1000]; . . . // предположим, в этом месте происходит заполнение всех массивов соответствующими объектами . . . for(int i = 0; i < p. length; i++) { //цикл с перебором всех ячеек массива. вызов метода draw() в случае, если ячейка не пустая. if(p[i]!=null) p[i]. draw(); } for(int i = 0; i < l. length; i++) { if(l[i]!=null) l[i]. draw(); } for(int i = 0; i < c. length; i++) { if(c[i]!=null) c[i]. draw(); } for(int i = 0; i < b. length; i++) { I f(b[i]!=null) b[i]. draw(); } 01. 02. 2018 15

Семинар 2. ООП. Решение 2. Point p[] = new Point[1000]; p[0] = new Circle(); Семинар 2. ООП. Решение 2. Point p[] = new Point[1000]; p[0] = new Circle(); p[1] = new Point(); p[2] = new Box(); p[3] = new Line(); . . . for(int i = 0; i < p. length; i++) { if(p[i]!=null) p[i]. draw(); } 01. 02. 2018 16

Семинар 2. ООП. Полиморфизм (polymorphism) - положение теории типов, согласно которому имена (например, переменных) Семинар 2. ООП. Полиморфизм (polymorphism) - положение теории типов, согласно которому имена (например, переменных) могут обозначать объекты разных (но имеющих общего родителя) классов. Процедурный полиморфизм предполагает возможность создания нескольких процедур или функций с одним и тем же именем, но разным количеством или различными типами передаваемых параметров - перегрузка (overloading) функций. void println() // переход на новую строку void println(boolean x) // выводит значение //булевской переменной (true или false) void println(String x) // выводит строку - значение // текстового параметра. 01. 02. 2018 17

Семинар 2. ООП. Агрегация – связь классов // определение класса Fish public class Fish Семинар 2. ООП. Агрегация – связь классов // определение класса Fish public class Fish { // определения поля home // (ссылка на объект Aquarium) private Aquarium home; public Fish() { } } // определение класса Aquarium public class Aquarium { // определения поля inhabitants // (массив ссылок на объекты Fish) private Fish inhabitants[]; public Aquarium() { } } 01. 02. 2018 18

Семинар 2. ООП. Ассоциация – связь классов public class Programmer { private Computer computers[]; Семинар 2. ООП. Ассоциация – связь классов public class Programmer { private Computer computers[]; public Programmer() { } } public class Computer { private Programmer programmers[]; public Computer() { } } 01. 02. 2018 19

Семинар 3. I/O. Чтение с консоли import java. util. Scanner; public class Input. Exp Семинар 3. I/O. Чтение с консоли import java. util. Scanner; public class Input. Exp { public static void main(String[] args) { String name; int age; Scanner in = new Scanner(System. in); // Reads a single line from the console // and stores into name variable name = in. next. Line(); // Reads a integer from the console // and stores into age variable age = in. next. Int(); in. close(); // Prints name and age to the console System. out. println("Name : " + name); System. out. println("Age : " + age); } } 01. 02. 2018 20

Семинар 3. I/O. Чтение из файла import java. io. File. Input. Stream; import java. Семинар 3. I/O. Чтение из файла import java. io. File. Input. Stream; import java. io. File. Not. Found. Exception; import java. util. Scanner; public class Scanner. Read. File { public static void main(String[] args) { try { File. Input. Stream file. Stream = new File. Input. Stream("test. txt"); // Create a new Scanner object which will read the data // from the file passed in. To check if there are more // line to read from it we check by calling the // scanner. has. Next. Line() method. We then read line one // by one till all line is read. Scanner scanner = new Scanner(file. Stream); while (scanner. has. Next. Line()) { String line = scanner. next. Line(); System. out. println(line); } } catch (File. Not. Found. Exception e) { e. print. Stack. Trace(); } } } 01. 02. 2018 21

Семинар 3. Типы данных. Объявление Простые или примитивные: q целочисленные (byte, short, int, long, Семинар 3. Типы данных. Объявление Простые или примитивные: q целочисленные (byte, short, int, long, char), q дробные (float, double), q булевые (boolean) n Объектные или ссылочные: q массивы, q классы Переменная: имя+тип+значение n int a; int b = 0, c = 3 + 2; int d = b + c; int e = a = 5; final double pi=3. 1415; 01. 02. 2018 22

Семинар 3. Типы данных. Примитивные vs ссылочные Примитивные типы хранят значения: int a = Семинар 3. Типы данных. Примитивные vs ссылочные Примитивные типы хранят значения: int a = 5; // объявляем первую переменную и // инициализируем ее int b = a; // объявляем вторую переменную и // приравниваем ее к первой a = 3; // меняем значение первой print(b); // проверяем значение второй Объектные типы хранят ссылки: class Point { int x, y; public Point(int i, int j) { } public void print() { System. out. println(x + ", " + y); } } Point p 1 = new Point(3, 5); Point p 2=p 1; p 1. x=7; print(p 2. x); 01. 02. 2018 Point p 1 = new Point(3, 5); Point p 2=p 1; p 1 = new Point(7, 9); print(p 2. x); p 2=null; 23

Семинар 3. Типы данных. Операции со ссылочными типами Обращение к полям и методам объекта Семинар 3. Типы данных. Операции со ссылочными типами Обращение к полям и методам объекта Point p 1 = new Point(3, 5); print(p 1. x); p 1. print(); Оператор instanceof Parent p = new Child(); // проверяем переменную p типа Parent // на совместимость с типом Child print(p instanceof Child); Операции сравнения == и != Point p 1=new Point(2, 3); Point p 2=p 1; Point p 3=new Point(2, 3); print(p 1==p 2); print(p 1==p 3); Оператор конкатенации со строкой + System. out. println("The point: " + p 1); 01. 02. 2018 24

Семинар 3. Типы данных. Класс Object Каждый класс в Java неявно наследуется от класса Семинар 3. Типы данных. Класс Object Каждый класс в Java неявно наследуется от класса Object. В нем определены некоторые методы, которые, таким образом, есть у любого класса. equals() - служит для сравнения объектов по значению, а не по ссылке. Point p 7=new Point(2, 3); Point p 8=new Point(2, 3); print(p 1. equals(p 2)); hash. Code() – представить любой объект целым числом Point p 7=new Point(2, 3); Point p 8=new Point(2, 3); print(p 7. hash. Code() == p 8. hash. Code()); to. String() - позволяет получить текстовое описание любого объекта Point p 7=new Point(2, 3); System. out. println(p 7. to. String()); 01. 02. 2018 Point@92 d 351 25

Семинар 3. Типы данных. Класс String занимает в Java особое положение: n Экземпляры только Семинар 3. Типы данных. Класс String занимает в Java особое положение: n Экземпляры только этого класса можно создавать без использования ключевого слова new. n Каждый строковый литерал порождает экземпляр String, и это единственный литерал (кроме null), имеющий объектный тип. String s 1 = "abc"; String s 2 = "abc"; String s 3 = "a"+"bc"; print(s 1==s 2); print(s 1==s 3); Много полезных методов: length(), split(String regex), substring(int begin. Index, int end. Index), to. Char. Array(), char. At(int index) и др. 01. 02. 2018 26

Семинар 3. Требования к проекту. Общие n n n Разработка в команде из 3 Семинар 3. Требования к проекту. Общие n n n Разработка в команде из 3 -4 человек, что рекомендуется, или в одиночку Презентация выбранного проекта с четкой формулировкой будущих работ каждого участника Согласование архитектуры проекта Каждый участник должен соблюсти все технические требования Проект должен быть доведен до планируемого рабочего состояния Презентация по итогам завершения проекта – что получилось, что нет 01. 02. 2018 27

Семинар 3. Требования к проекту. Технические обязательные n n Обработка ошибок как внутренних, так Семинар 3. Требования к проекту. Технические обязательные n n Обработка ошибок как внутренних, так и ошибок непредвиденного использования Применение многопоточного программирования, как минимум на уровне отделения рабочих процессов от интерфейса пользователя Использование в команде системы контроля версий (Subversion или Git. Hub) Соблюдение требований к оформлению кода (форматирование, комментарии и т. п. ) 01. 02. 2018 28

Семинар 3. Требования к проекту. Технические рекомендуемые n n n Наличие пользовательского интерфейса (GUI) Семинар 3. Требования к проекту. Технические рекомендуемые n n n Наличие пользовательского интерфейса (GUI) Наличие файлов сборки одной из систем сборки (Ant или Maven) Использование среды разработки (IDE: Eclipse или др. ) Использование Code Review Соблюдение Code Style 01. 02. 2018 29

Семинар 3. Возможные темы проектов n n n n «Микро-фотошоп» - набор фильтров для Семинар 3. Возможные темы проектов n n n n «Микро-фотошоп» - набор фильтров для обработки изображений различных типов «Редактор формул» - набор формул и их сохранение, пример - Math. Type «Реактор» - моделирование работы гомогенного (для начала) урановографитого ядерного реактора «Столкновение тел» - моделирование помолекулярного столкновения малых тел с учетом различных взаимодействий «Графики функций» - построение графиков функций, заданных разным способом - аналитически, участками и т. п. «Графы и сети» - программа для работы с сетямиграфами разного типа, нахождение кратчайших путей и т. п. «Дорожное движение» - моделирование дорожного движения в городе с некоторой картой каким-либо способом (гидродинамика, агентный подход и т. п. ) 01. 02. 2018 30

Семинар 3. Возможные темы проектов n n n «Фракталы» - построение множеств Жюлиа для Семинар 3. Возможные темы проектов n n n «Фракталы» - построение множеств Жюлиа для различных отображений, исследование критических точек «Экология» - двумерная трехкомпонентная экологическая модель «Жизнь» - генетический вариант игры жизнь, обобщение клеточных автоматов «Электростатика» - расчет полей и потенциалов системы зарядов «Чат» - программа обмена мгновенными сообщениями - чат, многопользовательский «Танчики» - многопользовательская игра «танчики» с ботами 01. 02. 2018 31

Семинар 4. Имена. Пакеты n n Пакеты (packages) в Java – это способ логически Семинар 4. Имена. Пакеты n n Пакеты (packages) в Java – это способ логически группировать классы В файловой системе они представлены директориями Аналогично директории, пакет может внутри кроме классов содержать и другие пакеты – свои элементы Примеры: java. lang, com. sun. misc, ru. mipt. dgap. cs 025. project 01. 02. 2018 32

Семинар 4. Имена n n Простое имя классов, полей и методов дается при объявлении: Семинар 4. Имена n n Простое имя классов, полей и методов дается при объявлении: Object, String, Point, to. String(), PI, Inner. Class Чтобы получить составное имя, надо к имени родителя, в котором находится элемент, через точку добавить простое имя элемента: java. lang. Object, java. lang. reflect. Method, com. myfirm. Main. Class, ref. to. String(), java. lang. Math. PI, Outer. Class. Inner. Class 01. 02. 2018 33

Семинар 4. Имена. Область видимости n У каждого имени есть область видимости (scope) class Семинар 4. Имена. Область видимости n У каждого имени есть область видимости (scope) class Pointer { int x, y; int get. X() { return x; // простое имя } } class Test { void main() { Pointer p = new Pointer(); p. x = 3; // составное имя } } 01. 02. 2018 34

Семинар 4. Имена. Classpath Не всегда удобно хранить все файлы в одном каталоге n Семинар 4. Имена. Classpath Не всегда удобно хранить все файлы в одном каталоге n Удобно распространять классы в виде JAR (Java ARchive) или ZIP архивов, для ускорения загрузки через сеть n Существует специальная переменная окружения classpath (по аналогии с path) - ее значение должно состоять из путей к каталогам или архивам, разделенных точкой с запятой. ; c: javaclasses; d: lib3 Dengine. zip; d: libfire. jar n 01. 02. 2018 35

Семинар 4. Модуль компиляции n n n Модуль компиляции (compilation unit) хранится в текстовом. Семинар 4. Модуль компиляции n n n Модуль компиляции (compilation unit) хранится в текстовом. java -файле и является единичной порцией входных данных для компилятора. Он состоит из трех частей: q объявление пакета ; q import -выражения; q объявления верхнего уровня. Порядок работы import: q сначала просматриваются выражения, импортирующие типы; q затем другие типы, объявленные в текущем пакете, в том числе в текущем модуле компиляции; q наконец, просматриваются выражения, импортирующие пакеты. Область видимости объявления верхнего уровня по умолчанию - пакет 01. 02. 2018 36

Семинар 4. Области видимости n n n Область видимости доступного пакета – вся программа Семинар 4. Области видимости n n n Область видимости доступного пакета – вся программа Областью видимости импортированного типа являются все объявления верхнего уровня в этом модуле компиляции Областью видимости класса верхнего уровня является пакет, в котором он объявлен Область видимости элементов классов – это все тело типа, в котором они объявлены, доступ через имя класса или зарезервированные слова this и super Аргументы метода, конструктора или обработчика ошибок видны только внутри этих конструкций и не могут быть доступны извне Область видимости локальных переменных начинается с момента их инициализации и до конца блока, в котором они объявлены 01. 02. 2018 37

Семинар 4. Перекрытие областей видимости Семинар 4. Перекрытие областей видимости "Затеняющее" объявление (Shadowing) class Human { n int age; // возраст void set. Age(int age) { this. age = age; // верное присвоение! } } 01. 02. 2018 38

Семинар 4. Перекрытие областей видимости Семинар 4. Перекрытие областей видимости "Заслоняющее" объявление (Obscuring) import java. awt. *; n public class Obscuring { static Point Test = new Point(3, 2); public static void main(String s[]) { System. out. print(Test. x); } } class Test { static int x = -5; } 01. 02. 2018 39

Семинар 4. Соглашения по именованию n n n Имя каждого пакета начинается с маленькой Семинар 4. Соглашения по именованию n n n Имя каждого пакета начинается с маленькой буквы и представляет собой, как правило, одно недлинное слово, возможно с подчеркиванием (com. sun. image. codec. jpeg, org. omg. CORBA. ORBPackage, oracle. jdbc. driver) Имена типов начинаются с большой буквы и могут состоять из нескольких слов, каждое следующее слово также начинается с большой буквы (Human, High. Green. Oak, Array. Index. Out. Of. Bounds. Exception, Runnable, Serializable, Cloneable) Имена методов должны быть глаголами и обозначать действия, которые совершает данный метод. Имя должно начинаться с маленькой буквы, но может состоять из нескольких слов, причем каждое следующее слово начинается с заглавной буквы. Существует ряд принятых названий для методов: q если методы предназначены для чтения и изменения значения переменной, то их имена начинаются, соответственно, с get и set, например, для переменной size это будут get. Size() и set. Size(); q метод, возвращающий длину, называется length(), например, в классе String ; q имя метода, который проверяет булевское условие, начинается с is, например, is. Visible() у компонента графического пользовательского интерфейса; q метод, который преобразует величину в формат F, называется to. F(), например, метод to. String(), который приводит любой объект к строке. 01. 02. 2018 40

Семинар 4. Соглашения по именованию n n n Поля класса имеют имена, записываемые в Семинар 4. Соглашения по именованию n n n Поля класса имеют имена, записываемые в том же стиле, что и для методов, начинаются с маленькой буквы, могут состоять из нескольких слов, каждое следующее слово начинается с заглавной буквы. Имена должны быть существительными, например, поле name в классе Human, или size в классе Planet. Имена констант состоят из последовательности слов, сокращений, аббревиатур. Записываются они только большими буквами, слова разделяются знаками подчеркивания (PI, MIN_VALUE, MAX_VALUE, COLOR_RED, COLOR_GREEN, COLOR_BLUE) Имена локальных переменных, параметров методов и обработчиков ошибок, как правило, довольно короткие, но, тем не менее, должны быть осмыслены. Например, можно использовать аббревиатуру (имя cp для ссылки на экземпляр класса Color. Point ) или сокращение ( buf для buffer ). Распространенные однобуквенные сокращения: q byte b; q char c; q int i, j, k; q long l; q float f; q double d; q Object o; q String s; q Exception e; // объект, представляющий ошибку в Java 01. 02. 2018 41

Семинар 4. CVS – Control Version Systems Система контроля версий – комплекс программного обспечения Семинар 4. CVS – Control Version Systems Система контроля версий – комплекс программного обспечения для обеспечения коллективной работы с исходным кодом, а так же отслеживания изменений в нем. Типичные задачи, которые позволяет решить система контроля версий: n Узнать, что я поменял с момента последней «живой» копии? n Получить исходник установленной месяц назад системы. n Параллельная работа 2 -х и более человек над одним исходником. Выбираем из двух систем контроля версий: n Subversion n GIT/Git. Hub 01. 02. 2018 42

Семинар 5. Объектная модель. Модификаторы доступа вводятся для защиты, или избавления, пользователя от излишних Семинар 5. Объектная модель. Модификаторы доступа вводятся для защиты, или избавления, пользователя от излишних зависимостей от деталей внутренней реализации public class Human { public int age; } Human h = get. Human(); // получаем ссылку int i=h. age; // ошибка!! public class Human { private int age; // метод, возвращающий значение age public int get. Age() { return age; } // метод, устанавливающий значение age public void set. Age(int a) { age=a; } } Human h = get. Human(); int i=h. get. Age(); // обращение через метод 01. 02. 2018 43

Семинар 5. Объектная модель. Зачем модификаторы доступа public class Human { // поле получает Семинар 5. Объектная модель. Зачем модификаторы доступа public class Human { // поле получает новый тип double private/* int */double age; // старые методы работают с округлением значения public int get. Age() { return (int) Math. round(age); } public void set. Age(int a) { age = a; } // добавляются новые методы для работы с типом double public double get. Exact. Age() { return age; } public void set. Exact. Age(double a) { age = a; } } 01. 02. 2018 44

Семинар 5. Объектная модель. Модификаторы доступа В Java модификаторы доступа указываются для: n классов Семинар 5. Объектная модель. Модификаторы доступа В Java модификаторы доступа указываются для: n классов объявления верхнего уровня; n элементов класса (полей, методов, внутренних типов); n конструкторов классов. Все четыре уровня доступа имеют только элементы типов и конструкторы. Это: n public; n private; n protected; n если не указан ни один из этих трех типов, то уровень доступа определяется по умолчанию (default). 01. 02. 2018 45

Семинар 5. Объектная модель. Объявление класса [public] [final] class Valid. Class. Name [extends Parent. Семинар 5. Объектная модель. Объявление класса [public] [final] class Valid. Class. Name [extends Parent. Class. Name] { [public, private, protected] [static] [final] int val. Name [=0]; [public, private, protected] [static] [final] My. Type val. Name 2 [=null]; [public, private, protected] Valid. Class. Name([int param. Name][, [final] My. Type param. Name 2][…]) [throws Exception. Name]{ [super(…); ]…. . } [public, private, protected] [static] [final] [void, int, My. Type] method. Name([int param. Name][, [final] My. Type param. Name 2][…]) [throws Exception. Name]{ [super. method. Name(…); ]…. } } 01. 02. 2018 46

Семинар 6. Объектная модель. Контексты выполнения К статическому контексту выполнения относятся: n статические методы, Семинар 6. Объектная модель. Контексты выполнения К статическому контексту выполнения относятся: n статические методы, n статические поля. Остальные части кода относятся к динамическому контексту: n обычные методы, n обычные поля, n конструкторы. 01. 02. 2018 47

Семинар 6. Объектная модель. Контексты выполнения class Test { public void process() { } Семинар 6. Объектная модель. Контексты выполнения class Test { public void process() { } public static void main(String s[]) { // process(); - ошибка! // у какого объекта его вызывать? Test test = new Test(); test. process(); // так правильно } } 01. 02. 2018 48

Семинар 6. Объектная модель. This и super public class Parent { int value; public Семинар 6. Объектная модель. This и super public class Parent { int value; public Parent(int value) { this. value = value; } public int get. Value() { return value; } } 01. 02. 2018 49

Семинар 6. Объектная модель. This и super class Child extends Parent { public Child(int Семинар 6. Объектная модель. This и super class Child extends Parent { public Child(int value) { super(value); } // переопределение метода public int get. Value() { // обращение к методу родителя return super. get. Value() + 1; } public static void main(String s[]) { Child c = new Child(5); System. out. println(c. get. Value()); } } 01. 02. 2018 50

Семинар 6. Объектная модель. Abstract // Базовая арифметическая операция public abstract class Operation { Семинар 6. Объектная модель. Abstract // Базовая арифметическая операция public abstract class Operation { public abstract int calculate(int a, int b); } // Сложение class Addition extends Operation { public int calculate(int a, int b) { return a+b; } } // Вычитание class Subtraction extends Operation { public int calculate(int a, int b) { return a-b; } } 01. 02. 2018 51

Семинар 6. Объектная модель. Abstract class Test { public static void main(String s[]) { Семинар 6. Объектная модель. Abstract class Test { public static void main(String s[]) { Operation o 1 = new Addition(); Operation o 2 = new Subtraction(); o 1. calculate(2, 3); o 2. calculate(3, 5); } } 01. 02. 2018 52

Семинар 6. Объектная модель. Interface public interface Drawable extends Colorable, Resizable { public final Семинар 6. Объектная модель. Interface public interface Drawable extends Colorable, Resizable { public final static int RIGHT = 1; int LEFT = 2; int UP = 3; int DOWN = 4; public abstract void move. Right(); void move. Left(); void move. Up(); void move. Down(); } 01. 02. 2018 53

Семинар 6. Объектная модель. Использование интерфейсов public interface Insect. Consumer { void consume. Insect(Insect Семинар 6. Объектная модель. Использование интерфейсов public interface Insect. Consumer { void consume. Insect(Insect i); } // росянка расширяет класс растение class Sundew extends Plant implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } // ласточка расширяет класс птица class Swallow extends Bird implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } 01. 02. 2018 54

Семинар 6. Объектная модель. Использование интерфейсов // муравьед расширяет класс млекопитающее class Ant. Eater Семинар 6. Объектная модель. Использование интерфейсов // муравьед расширяет класс млекопитающее class Ant. Eater extends Mammal implements Insect. Consumer { public void consume. Insect(Insect i) { //. . . } } // служащий, отвечающий за кормление, // расширяет класс служащий class Feed. Worker extends Worker { // с помощью этого метода можно накормить // и росянку, и ласточку, и муравьеда public void feed. On. Insects(Insect. Consumer consumer) { consumer. consume. Insect(new Insect()); } } 01. 02. 2018 55

Семинар 6. Объектная модель Ссылочный тип обладает следующими элементами: n непосредственно объявленными в его Семинар 6. Объектная модель Ссылочный тип обладает следующими элементами: n непосредственно объявленными в его теле; n объявленными в его родительском классе и реализуемых интерфейсах, кроме: q private -элементов; q "скрытых" элементов (полей и статических методов, скрытых одноименными элементами); q переопределенных (динамических) методов. 01. 02. 2018 56

Семинар 7. Преобразование типов Тип устанавливается на основе структуры применяемых выражений и типов литералов, Семинар 7. Преобразование типов Тип устанавливается на основе структуры применяемых выражений и типов литералов, переменных и методов, используемых в этих выражениях. long a = 3; a = 5 + 'A' + a; print("a=" + Math. round(a / 2 F)); int b=1; byte c=(byte)-b; int i=c; 01. 02. 2018 57

Семинар 7. Преобразование типов. Примитивные типы В Java предусмотрено семь видов приведений: n тождественное Семинар 7. Преобразование типов. Примитивные типы В Java предусмотрено семь видов приведений: n тождественное (identity): print((My. Flat. Impl)(get. City(). get. Street(). get. House(). get. Flat())); n расширение примитивного типа (widening primitive) - автоматические: long d=111111 L; float f = d; a = (long) f; print(d); n сужение примитивного типа (narrowing primitive) – явно, т. к. можно потерять данные: print((byte)383); print((byte)384); print((byte)-384); char ch=40000; print((short)ch); 01. 02. 2018 58

Семинар 7. Преобразование типов. Объектные типы class Parent { int x; } class Child Семинар 7. Преобразование типов. Объектные типы class Parent { int x; } class Child extends Parent { int y; } class Child 2 extends Parent { int z; } 01. 02. 2018 59

Семинар 7. Преобразование типов n расширение объектного типа (widening reference) – автоматически: Parent p Семинар 7. Преобразование типов n расширение объектного типа (widening reference) – автоматически: Parent p 1=new Child(); Parent p 2=new Child 2(); Parent p 3=null; n сужение объектного типа (narrowing reference) – явно, т. к. может быть Class. Cast. Exception: Parent p = new Child(); Child c = (Child) p; // преобразование будет успешным. Parent p 2 = new Child 2(); Child c 2 = (Child) p 2; // во время исполнения возникнет ошибка! if (p 2 instanceof Child) { Child c 3 = (Child) p 2; } 01. 02. 2018 60

Семинар 7. Преобразование типов. Оставшиеся случаи n n преобразование к строке (String) – автоматически Семинар 7. Преобразование типов. Оставшиеся случаи n n преобразование к строке (String) – автоматически любые типы; запрещенные преобразования (forbidden): q q q 01. 02. 2018 переходы от любого ссылочного типа к примитивному, от примитивного - к ссылочному (кроме преобразований к строке); тип boolean нельзя привести ни к какому другому типу, кроме boolean (за исключением приведения к строке); невозможно привести друг к другу типы, находящиеся не на одной, а на соседних ветвях дерева наследования и др. 61

Семинар 7. Ошибки. Исключительные ситуации Ошибки могут возникать как по причине недостаточной внимательности программиста Семинар 7. Ошибки. Исключительные ситуации Ошибки могут возникать как по причине недостаточной внимательности программиста (отсутствует нужный класс, или индекс массива вышел за допустимые границы), так и по независящим от него причинам (произошел разрыв сетевого соединения, сбой аппаратного обеспечения, например, жесткого диска и др. ). При возникновении исключительной ситуации управление передается от кода, вызвавшего исключительную ситуацию, на ближайший блок catch (или вверх по стеку) и создается объект, унаследованный от класса Throwable, или его потомков (см. диаграмму иерархии классов-исключений), который содержит информацию об исключительной ситуации и используется при ее обработке. 01. 02. 2018 62

Семинар 7. Ошибки. Обработка ошибок try { if (p. x == 0) { throw Семинар 7. Ошибки. Обработка ошибок try { if (p. x == 0) { throw new Some. Exception. Class(); } else { throw new Another. Exception. Class(); } //. . . } catch (Some. Exception. Class e) { // от менее общих к более общим //. . . } catch (Another. Exception. Class e) { //. . . } finally { } 01. 02. 2018 63

Семинар 7. Ошибки. Проверяемые и непроверяемые исключений 01. 02. 2018 64 Семинар 7. Ошибки. Проверяемые и непроверяемые исключений 01. 02. 2018 64

Семинар 9. Коллекции Все классы коллекций унаследованы от различных интерфейсов, которые определяют поведение коллекции. Семинар 9. Коллекции Все классы коллекций унаследованы от различных интерфейсов, которые определяют поведение коллекции. Иными словами интерфейс определяет «что делает коллекция» , а конкретная реализация «как коллекция делает то что определяет интерфейс» . При разработке приложений рекомендуется, там где это возможного, использовать интерфейсы, т. к. это: nпозволяет легко заменять реализацию интерфейса, с целью повышения производительности, например, nпозволяет разработчику сконцентрироваться на задаче, а не на особенностях реализации. Интерфейсы коллекций: Map – карта отображения вида “ключ-значение”; Collection – вершина иерархии остальных коллекций; List – специализирует коллекции для обработки списков; Set – специализирует коллекции для обработки множеств, содержащих уникальные элементы. 01. 02. 2018 65

Семинар 9. Коллекции. Обзор 01. 02. 2018 66 Семинар 9. Коллекции. Обзор 01. 02. 2018 66

Семинар 9. Коллекции. Collection В интерфейсе Collection<E> определены методы, которые работают на всех коллекциях: Семинар 9. Коллекции. Collection В интерфейсе Collection определены методы, которые работают на всех коллекциях: n boolean add(E obj) – добавляет obj к вызывающей коллекции и возвращает true, если объект добавлен, и false, если obj уже элемент коллекции; n boolean add. All(Collection c) – добавляет все элементы коллекции к вызывающей коллекции; n void clear() – удаляет все элементы из коллекции; n boolean contains(Object obj) – возвращает true, если вызывающая коллекция содержит элемент obj; n boolean equals(Object obj) – возвращает true, если коллекции эквивалентны; n boolean is. Empty() – возвращает true, если коллекция пуста; n Iterator iterator() – извлекает итератор; n boolean remove(Object obj) – удаляет obj из коллекции; n int size() – возвращает количество элементов в коллекции; n Object[] to. Array() – копирует элементы коллекции в массив объектов; n T[] to. Array(T a[]) – копирует элементы коллекции в массив объектов определенного типа. 01. 02. 2018 67

Семинар 9. Коллекции. Списки 01. 02. 2018 68 Семинар 9. Коллекции. Списки 01. 02. 2018 68

Семинар 9. Коллекции. List Методы интерфейса List<E> позволяют вставлять и удалять элементы из позиций, Семинар 9. Коллекции. List Методы интерфейса List позволяют вставлять и удалять элементы из позиций, указываемых через отсчитываемый от нуля индекс: n void add(int index, E element) – вставляет element в позицию, указанную в index; n void add. All(int index, Collection c) – вставляет в вызывающий список все элементы коллекции с, начиная с позиции index; n E get(int index) – возвращает элемент в виде объекта из позиции index; n int index. Of(Object ob) – возвращает индекс указанного объекта; n E remove(int index) – удаляет объект из позиции index; n E set(int index, E element) – заменяет объект в позиции index, возвращает при этом удаляемый элемент; n List sub. List(int from. Index, int to. Index) – извлекает часть коллекции в указанных границах. Класс Array. List – динамический массив объектных ссылок, удаление и добавление элементов для такой коллекции представляет собой ресурсоемкую задачу. Коллекция Linked. List реализует связанный список. В отличие от массива, который хранит объекты в последовательных ячейках памяти, связанный список хранит объекты отдельно, но вместе со ссылками на следующее и предыдущее звенья последовательности. 01. 02. 2018 69

Семинар 9. Коллекции. Queue Методы интерфейса Queue<E>: n E element() – возвращает, но не Семинар 9. Коллекции. Queue Методы интерфейса Queue: n E element() – возвращает, но не удаляет головной элемент очереди; n boolean offer(E o) – вставляет элемент в очередь, если возможно; n E peek() – возвращает, но не удаляет головной элемент очереди, возвращает null, если очередь пуста; n E poll() – возвращает и удаляет головной элемент очереди, возвращает null, если очередь пуста; n E remove() – возвращает и удаляет головной элемент очереди. 01. 02. 2018 70

Семинар 9. Коллекции. Сортировка public class Student { private int id. Student; private float Семинар 9. Коллекции. Сортировка public class Student { private int id. Student; private float mean. Mark; public Student(float m, int id) { mean. Mark = m; id. Student = id; } public Student() { } public float get. Mark() { return mean. Mark; } public int get. Id. Student() { return id. Student; } } 01. 02. 2018 71

Семинар 9. Коллекции. Сортировка Array. List<Student> p = new Array. List<Student>(); p. add(new Student(3. Семинар 9. Коллекции. Сортировка Array. List p = new Array. List(); p. add(new Student(3. 9 f, 52201)); p. add(new Student(3. 65 f, 52214)); p. add(new Student(3. 71 f, 52251)); p. add(new Student(3. 02 f, 52277)); p. add(new Student(3. 81 f, 52292)); p. add(new Student(9. 55 f, 52271)); // сортировка списка объектов Collections. sort(p, new Comparator() { public int compare(Student o 1, Student o 2) { return o 2. get. Id. Student() - o 1. get. Id. Student(); } }); 01. 02. 2018 72

Семинар 9. Коллекции. Множества 01. 02. 2018 73 Семинар 9. Коллекции. Множества 01. 02. 2018 73

Семинар 9. Коллекции. Set Класс Hash. Set<E> использует хэш-таблицу для хранения коллекции. Ключ (хэш-код) Семинар 9. Коллекции. Set Класс Hash. Set использует хэш-таблицу для хранения коллекции. Ключ (хэш-код) используется вместо индекса для доступа к данным, что значительно ускоряет поиск определенного элемента. Скорость поиска существенна для коллекций с большим количеством элементов. Все элементы такого множества упорядочены посредством хэш-таблицы, в которой хранятся хэш-коды элементов. Класс Tree. Set для хранения объектов использует бинарное дерево. При добавлении объекта в дерево он сразу же размещается в необходимую позицию с учетом сортировки. Сортировка происходит благодаря тому, что все добавляемые элементы реализуют интерфейсы Comparable и/или Comparator. Обработка операций удаления и вставки объектов происходит медленнее, чем в хэш-множествах, но быстрее, чем в списках. 01. 02. 2018 74

Семинар 9. Коллекции. Карты 01. 02. 2018 75 Семинар 9. Коллекции. Карты 01. 02. 2018 75

Семинар 9. Коллекции. Set Интерфейс Map<K, V> содержит следующие методы: n void clear() – Семинар 9. Коллекции. Set Интерфейс Map содержит следующие методы: n void clear() – удаляет все пары из вызываемой карты; n boolean contains. Key(Object key) – возвращает true, если вызывающая карта содержит key как ключ; n boolean contains. Value(Object value) – возвращает true, если вызывающая карта содержит value как значение; n Set> entry. Set() – возвращает множество, содержащее значения карты; n Set key. Set() – возвращает множество ключей; n V get(Object obj) – возвращает значение, связанное с ключом obj; n V put(K key, V value) – помещает ключ key и значение value в вызывающую карту; n void put. All(Map t) – помещает коллекцию t в вызывающую карту; n V remove(Object key) – удаляет пару “ключ-значение” по ключу key; n Collection values() – возвращает коллекцию, содержащую значения карты. Tree. Map – расширяет Abstract. Map, используя дерево, где ключи расположены в виде дерева поиска в строгом порядке. Weak. Hash. Map позволяет механизму сборки мусора удалять из карты значения по ключу, ссылка на который вышла из области видимости приложения. Linked. Hash. Map запоминает порядок добавления объектов в карту и образует при этом дважды связанный список ключей. Этот механизм эффективен, только если превышен коэффициент загруженности карты при работе с кэш-памятью. 01. 02. 2018 76

Семинар 10. Потоки. Зачем? n n Выполнение задач, где действительно требуется выполнять несколько действий Семинар 10. Потоки. Зачем? n n Выполнение задач, где действительно требуется выполнять несколько действий одновременно: сервер общего пользования, активные игры (опрашивание клавиатуры и других устройства ввода) и т. д. Вычислительное устройство – лишь один из ресурсов, необходимых для выполнения задач. Всегда есть оперативная память, дисковая подсистема, сетевые подключения, периферия и т. д. , которые необходимо делить. Пример: пользователю требуется распечатать большой документ и скачать большой файл из сети. Более гибко управлять выполнением задач: реализация кнопки Cancel, регулирование приоритетами и т. п. Обслуживающие потоки: автоматический сборщик мусора в Java запускается в виде фонового (низкоприоритетного) процесса – демон (daemon). 01. 02. 2018 77

Семинар 10. Потоки. Thread public class My. Thread extends Thread { public void run() Семинар 10. Потоки. Thread public class My. Thread extends Thread { public void run() { // некоторое долгое действие, вычисление long sum = 0; for (int i = 0; i < 1000; i++) { sum += i; } System. out. println(sum); } } My. Thread t = new My. Thread(); t. start(); 01. 02. 2018 78

Семинар 10. Потоки. Runnable Public class My. Runnable implements Runnable { public void run() Семинар 10. Потоки. Runnable Public class My. Runnable implements Runnable { public void run() { // некоторое долгое действие, вычисление long sum = 0; for (int i = 0; i < 1000; i++) { sum += i; } System. out. println(sum); } } Runnable r = new My. Runnable(); Thread t = new Thread(r); t. start(); 01. 02. 2018 79

Семинар 10. Потоки. Приоритеты public class Thread. Test implements Runnable { public void run() Семинар 10. Потоки. Приоритеты public class Thread. Test implements Runnable { public void run() { double calc; for (int i = 0; i < 50000; i++) { calc = Math. sin(i * i); if (i % 10000 == 0) { System. out. println(get. Name() + " counts " + i / 10000); } } } public String get. Name() { return Thread. current. Thread(). get. Name(); } 01. 02. 2018 80

Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread t[] = new Thread[3]; for (int i = 0; i < t. length; i++) { t[i] = new Thread(new Thread. Test(), "Thread " + i); } // Запуск потоков for (int i = 0; i < t. length; i++) { t[i]. start(); System. out. println(t[i]. get. Name() + " started"); } } } 01. 02. 2018 81

Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread Семинар 10. Потоки. Приоритеты public static void main(String s[]) { // Подготовка потоков Thread t[] = new Thread[3]; for (int i = 0; i < t. length; i++) { t[i] = new Thread(new Thread. Test(), "Thread " + i); t[i]. set. Priority(Thread. MIN_PRIORITY + (Thread. MAX_PRIORITY - Thread. MIN_PRIORITY) / t. length* i); } // Запуск потоков for (int i = 0; i < t. length; i++) { t[i]. start(); System. out. println(t[i]. get. Name() + " started"); } } 01. 02. 2018 82

Семинар 10. Потоки. Демон class Thread. Test implements Runnable { // Отдельная группа, в Семинар 10. Потоки. Демон class Thread. Test implements Runnable { // Отдельная группа, в которой будут // находиться все потоки Thread. Test public final static Thread. Group GROUP = new Thread. Group("Daemon demo"); // Стартовое значение, указывается при создании объекта private int start; public Thread. Test(int s) { start = (s % 2 == 0) ? s : s + 1; new Thread(GROUP, this, "Thread " + start). start(); } public static void main(String s[]) { new Thread. Test(16); new Daemon. Demo(); } 01. 02. 2018 83

Семинар 10. Потоки. Демон public void run() { // Начинаем обратный отсчет for (int Семинар 10. Потоки. Демон public void run() { // Начинаем обратный отсчет for (int i = start; i > 0; i--) { try { Thread. sleep(300); } catch (Interrupted. Exception e) { } // По достижении середины порождаем // новый поток с половинным начальным // значением if (start > 2 && i == start / 2) { new Thread. Test(i); } } } } 01. 02. 2018 84

Семинар 10. Потоки. Демон class Daemon. Demo extends Thread { public Daemon. Demo() { Семинар 10. Потоки. Демон class Daemon. Demo extends Thread { public Daemon. Demo() { super("Daemon demo thread"); set. Daemon(true); start(); } public void run() { Thread threads[] = new Thread[10]; while (true) { 01. 02. 2018 85

Семинар 10. Потоки. Демон // Получаем набор всех потоков из // тестовой группы int Семинар 10. Потоки. Демон // Получаем набор всех потоков из // тестовой группы int count = Thread. Test. GROUP. active. Count(); if (threads. length < count) threads = new Thread[count + 10]; count = Thread. Test. GROUP. enumerate(threads); // Распечатываем имя каждого потока for (int i = 0; i < count; i++) { System. out. print(threads[i]. get. Name() + ", "); } System. out. println(); try { Thread. sleep(300); } catch (Interrupted. Exception e) {} } 01. 02. 2018 86

Семинар 11. Потоки. Работа с памятью Основные операции, доступные для потоков при работе с Семинар 11. Потоки. Работа с памятью Основные операции, доступные для потоков при работе с памятью: n use – чтение значения переменной из рабочей памяти потока; n assign – запись значения переменной в рабочую память потока; n read – получение значения переменной из основного хранилища; n load – сохранение значения переменной, прочитанного из основного хранилища, в рабочей памяти; n store – передача значения переменной из рабочей памяти в основное хранилище для дальнейшего хранения; n write – сохраняет в основном хранилище значение переменной, переданной командой store. Последовательность команд подчиняется следующим правилам: n все действия, выполняемые одним потоком, строго упорядочены, т. е. выполняются одно за другим; n все действия, выполняемые с одной переменной в основном хранилище памяти, строго упорядочены, т. е. следуют одно за другим. 01. 02. 2018 87

Семинар 11. Потоки. Volatile Модификатор поля volatile устанавливает более строгие правила работы со значениями Семинар 11. Потоки. Volatile Модификатор поля volatile устанавливает более строгие правила работы со значениями переменных. n Если поток собирается выполнить команду use для volatile переменной, то требуется, чтобы предыдущим действием с этой переменной было обязательно load, и наоборот – операция load может выполняться только перед use. Таким образом, переменная и главное хранилище всегда имеют самое последнее значение этой переменной. n Если поток собирается выполнить команду store для volatile переменной, то требуется, чтобы предыдущим действием над этой переменной было обязательно assign, и наоборот – операция assign может выполняться, только если следующей будет store. Таким образом, переменная и главное хранилище всегда имеют самое последнее значение этой переменной. n Наконец, если проводятся операции над несколькими volatile переменными, то передача соответствующих изменений в основное хранилище должна проводиться строго в том же порядке. 01. 02. 2018 88

Семинар 11. Потоки. Блокировки Операции блокировки объекта в хранилище: n lock – установить блокировку, Семинар 11. Потоки. Блокировки Операции блокировки объекта в хранилище: n lock – установить блокировку, только один поток в один момент времени может установить блокировку на некоторый объект; n unlock - снять блокировку, если до того, как этот поток выполнит операцию unlock, другой поток попытается установить блокировку, его выполнение будет приостановлено до тех пор, пока первый поток не отпустит ее. После успешно выполненного lock рабочая память очищается и все переменные необходимо заново считывать из основного хранилища. Аналогично, перед операцией unlock необходимо все переменные сохранить в основном хранилище. 01. 02. 2018 89

Семинар 11. Потоки. Synchronized public class Thread. Test implements Runnable { private static Thread. Семинар 11. Потоки. Synchronized public class Thread. Test implements Runnable { private static Thread. Test shared = new Thread. Test(); public void process() { for (int i = 0; i < 3; i++) { System. out. println(Thread. current. Thread(). get. Name() + " " + i); Thread. yield(); } } public void run() { shared. process(); } public static void main(String s[]) { for (int i = 0; i < 3; i++) { new Thread(new Thread. Test(), "Thread-" + i). start(); } } } 01. 02. 2018 90

Семинар 11. Потоки. Synchronized public void run() { synchronized (shared) { shared. process(); } Семинар 11. Потоки. Synchronized public void run() { synchronized (shared) { shared. process(); } } Thread-0 0 Thread-0 1 Thread-0 2 Thread-1 0 Thread-1 1 Thread-1 2 Thread-2 0 Thread-2 1 Thread-2 2 01. 02. 2018 91

Семинар 11. Потоки. Deadlock public class Deadlock. Demo { // Два объекта-ресурса public final Семинар 11. Потоки. Deadlock public class Deadlock. Demo { // Два объекта-ресурса public final static Object one = new Object(), two = new Object(); public static void main(String s[]) { // Создаем два потока, которые будут // конкурировать за доступ к объектам // one и two Thread t 1 = new Thread() {…}; Thread t 2 = new Thread() {…}; // Запускаем потоки t 1. start(); t 2. start(); } } 01. 02. 2018 92

Семинар 11. Потоки. Deadlock Thread t 1 = new Thread() { public void run() Семинар 11. Потоки. Deadlock Thread t 1 = new Thread() { public void run() { // Блокировка первого объекта synchronized (one) { Thread. yield(); // Блокировка второго объекта synchronized (two) { System. out. println("Success!"); } }; 01. 02. 2018 93

Семинар 11. Потоки. Deadlock Thread t 2 = new Thread() { public void run() Семинар 11. Потоки. Deadlock Thread t 2 = new Thread() { public void run() { // Блокировка второго объекта synchronized (two) { Thread. yield(); // Блокировка первого объекта synchronized (one) { System. out. println("Success!"); } }; 01. 02. 2018 94

Семинар 11. Потоки. Wait-set Каждый объект в Java имеет wait-set - набор потоков исполнения. Семинар 11. Потоки. Wait-set Каждый объект в Java имеет wait-set - набор потоков исполнения. n Любой поток может вызвать метод wait() любого объекта и таким образом попасть в его wait-set. n Выполнение такого потока приостанавливается до тех пор, пока другой поток не вызовет у этого же объекта метод notify. All(), который пробуждает все потоки из wait-set. n Метод notify() пробуждает один случайно выбранный поток из данного набора. Любой из них может быть вызван потоком у объекта только после установления блокировки на этот объект. То есть либо внутри synchronized -блока с ссылкой на этот объект в качестве аргумента, либо обращения к методам должны быть в синхронизированных методах класса самого объекта. 01. 02. 2018 95

Семинар 11. Потоки. Wait-set class Wait. Thread implements Runnable { private Object shared; public Семинар 11. Потоки. Wait-set class Wait. Thread implements Runnable { private Object shared; public Wait. Thread(Object o) { shared = o; } public void run() { synchronized (shared) { try { shared. wait(); } catch (Interrupted. Exception e) { } System. out. println("after wait"); } } … } 01. 02. 2018 96

Семинар 11. Потоки. Wait-set public static void main(String s[]) { Object o = new Семинар 11. Потоки. Wait-set public static void main(String s[]) { Object o = new Object(); Wait. Thread w = new Wait. Thread(o); new Thread(w). start(); try { Thread. sleep(100); } catch (Interrupted. Exception e) { } System. out. println("before notify"); synchronized (o) { o. notify. All(); } } 01. 02. 2018 97