Смекни!
smekni.com

Многопоточность и работа с потоками (стр. 1 из 6)

Факультет "Информатика и системы управления"

Методические указания к лабораторной работе

по курсу "Распределенные системы обработки информации"

Многопоточность

Москва 2004 г.


Оглавление

Цель работы.. 3

Задание для домашней подготовки. 3

Задание к лабораторной работе. 3

Содержание отчета. 4

Контрольные вопросы. 4

Литература. 6

Приложение 1. Графические примитивы. 7

Методы класса Graphics. 7

Преобразование координат. 21

Рисование фигур средствами Java2D.. 25

Приложение 2. Манипуляции с курсорами. 31

Класс Cursor 31

Приложение 3. Обработка действий мыши и клавиатуры. 35

Обработка действий мыши. 35

Обработка действий клавиатуры.. 36

Приложение 4. Нити процессов. 38

Класс Thread и интерфейс Runnable. 39

Приложение 5. Согласование работы нескольких потоков. 43

Приложение 6. Пример программы «Бегущая строка». 44

Цель работы

1. Освоить пакет java.appletи класс java.applet.Applet.

2. Научится обрабатывать действия мыши и клавиатуры.

3. Познакомиться с возможностями пакетов java.awt.geom, java.awt и классов java.awt.Graphics и java.awt.Graphics2D.

4. Изучить основные графические примитивы.

5. Освоить работу с потоками.

6. Применить полученные знания на практике

Задание для домашней подготовки

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

Задание к лабораторной работе

Разработать аплет, реализующий игру, который должен содержать следующие элементы:

o основа пользовательского интерфейса — графические объекты, созданные на основе пакетов java.awt, java.awt.geom и классов java.awt.Graphics и java.awt.Graphics2D.

o не менее двух движущихся объектов, созданных на основе тех же пакетов и классов. Каждый объект должен управляется своим потоком, что должно быть визуально заметно (например, с помощью задания разных значений в соответствующих методах Thread.sleep()).

Управление игрой должно осуществляться с клавиатуры и/или мышью. Если используется только мышь, то нельзя использовать курсор, заданный по умолчанию, (вместо него надо использовать любой другой, подходящий по смыслу, или создать свой).

o дополнительно (не обязательно) – в игре может вестись подсчет очков.

В качестве возможного варианта игры подойдет, например, «тир» или «футбол».

Содержание отчета

Отчет должен содержать:

1. Постановку задачи, решаемой отлаженной программой.

2. Руководство пользователя отлаженной программы, содержащее описание интерфейсов всех функций программы.

3. Листинг программы с необходимыми комментариями.

Контрольные вопросы

1. В случае, если программа – аплет состоит из нескольких классов и после компиляции сгенерировано несколько файлов *.class, как внутри контейнера <applet></applet> html – файла это необходимо указать?

2. Сколько классов в пакете java.applet?

3. Как получить координаты центра окна?

4. Что такое интерлиньяж?

5. Как задать форму курсора?

6. Назовите имя главного потока в Java – программе (главный поток – это поток, который запускает метод main()).

7. По какому принципу присваиваются имена потокам, чьи имена не задаются программистом явно?

8. Каким образом можно составить композицию аффинных преобразований, чтобы в дальнейшем применять ее к объекту как единое преобразование.

Литература

Официальные источники:

1. Кен Арнольд, Джеймс Гослинг, Дэвид Холмс. Язык программирования Java™.

2. Официальный сайт Java — http://java.sun.com/ (есть раздел на русском языке с учебником).

3. Java™ 2 SDK, Standard Edition Documentation — http://java.sun.com/products/jdk/1.5/index.html.

4. Джеймс Гослинг, Билл Джой, Гай Стил. СпецификацияязыкаJava (TheJavaLanguageSpecification — http://www.javasoft.com/docs/books/jls/). Перевод на русский язык — http://www.uni-vologda.ac.ru/java/jls/index.html

5. Официальный сайт проекта Eclipse — http://www.eclipse.org/.

Другое:

1. Дмитрий Рамодин. Начинаем программировать на языке Java.

2. Николай Смирнов. Java 2: Учебное пособие.

3. Картузов А. В. Программирование на языке Java.

4. Вязовик Н.А. Программирование на Java.

5. Алексей Литвинюк. Введение в интегрированную среду разработки Eclipse — http://lib.juga.ru/article/articleview/174/1/69/.

Приложение 1. Графические примитивы

При создании компонента автоматически формируется его графический контекст. В контексте размещается область рисования и вывода текста и изображений. Контекст содержит текущий и альтернативный цвет рисования и цвет фона — объекты класса Color, текущий шрифт для вывода текста — объект класса Font.

В контексте определена система координат, начало которой с координатами (0, 0) расположено в верхнем левом углу области рисования, ось Ох направлена вправо, ось Оу — вниз. Координаты измеряются в пикселях.

Управляет контекстом класс Graphics или новый класс Graphics2D, введенный в Java 2. Поскольку графический контекст сильно зависит от конкретной графической платформы, эти классы сделаны абстрактными. Поэтому нельзя непосредственно создать экземпляры класса Graphics или Graphics2D.

Однако каждая виртуальная машина Java реализует методы этих классов, создает их экземпляры для компонента и предоставляет объект класса Graphics методом getGraphics() класса Component или как аргумент методов paint() и update().

Посмотрим сначала, какие методы работы с графикой и текстом предоставляет класс Graphics.

Методы класса Graphics

При создании контекста в нем задается текущий цвет для рисования, обычно черный, и цвет фона области рисования — белый или серый. Изменить текущий цвет можно методом setColor (Color newColor), аргумент newColor которого — объект класса Color.

Узнать текущий цвет можно методом getColor (), возвращающим объект класса Color.

Как задать цвет

Цвет, как и все в Java, — объект определенного класса, а именно, класса Color. Основу класса составляют семь конструкторов цвета. Самый простой конструктор:

Color(int red, int green, int blue)

создает цвет, получающийся как смесь красной red, зеленой green и синей blue составляющих. Эта цветовая модель называется RGB. Каждая составляющая меняется от 0 (отсутствие составляющей) до 255 (полная интенсивность этой составляющей). Например:

Color pureRed = new Color(255, 0, 0);

Color pureGreen = new Color(0, 255, 0);

определяют чистый ярко-красный pureRed и чистый ярко-зеленый pureGreen цвета.

Во втором конструкторе интенсивность составляющих можно изменять более гладко вещественными числами от 0.0 (отсутствие составляющей) до 1.0 (полная интенсивность составляющей):

Color(float red, float green, float blue)

Например, Color someColor = new Color(O.OSf, 0.4f, 0.95f);

Третий конструктор

Color(int rgb)

задает все три составляющие в одном целом числе. В битах 16—23 записывается красная составляющая, в битах 8—15 — зеленая, а в битах 0—7 — синяя составляющая цвета. Например, Color с = new Color(OXFF8F48FF);

Здесь красная составляющая задана с интенсивностью 0x8F, зеленая — 0x48, синяя0xFF.

Следующиетриконструктора

Color(int red, int green, int blue, int alpha)

Color(float red, float green, float blue, float alpha)

Color(int rgb, boolean hasAlpha)

вводят четвертую составляющую цвета, так называемую "альфу", определяющую прозрачность цвета. Эта составляющая проявляет себя при наложении одного цвета на другой. Если альфа равна 255 или 1.0, то цвет совершенно непрозрачен, предыдущий цвет не просвечивает сквозь него. Если альфа равна 0 или 0.0, то цвет абсолютно прозрачен, для каждого пикселя виден только предыдущий цвет.

Последний из этих конструкторов учитывает составляющую альфа, находящуюся в битах 24—31, если параметр hasAlpha равен true. Если же hasAlpha равно false, то составляющая альфа считается равной 255, независимо от того, что записано в старших битах параметра rgb.

Первые три конструктора создают непрозрачный цвет с альфой, равной 255 или 1.0.

Седьмойконструктор

Color(ColorSpace cspace, float[] components, float alpha)

позволяет создавать цвет не только в цветовой модели (color model) RGB, но и в других моделях: CMYK, HSB, CIEXYZ, определенных объектом класса ColorSpace.

Для создания цвета в модели HSB можно воспользоваться статическим методом

getHSBColor(float hue, float saturation, float brightness).

Если нет необходимости тщательно подбирать цвета, то можно просто воспользоваться одной из тринадцати статических констант типа Color, имеющихся в классе Color. Вопреки соглашению "Code Conventions" они записываются строчными буквами: black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow.

Методы класса Color позволяют получить составляющие текущего цвета: getRed(), getGreen(), getBlue(), getAlpha(), getRGB(), getColorSpace(), getComponents().

Два метода создают более яркий brighter() и более темный darker() цвета по сравнению с текущим цветом. Они полезны, если надо выделить активный компонент или, наоборот, показать неактивный компонент бледнее остальных компонентов.

Два статических метода возвращают цвет, преобразованный из цветовой модели RGB в HSB и обратно:

float[] RGBtoHSB(int red, int green, int blue, float[] hsb)

int HSBtoRGB(int hue, int saturation, int brightness)

Создав цвет, можно рисовать им в графическом контексте.

Как нарисовать чертеж

Основной метод рисования

drawLine(int x1, int y1, int х2, int y2)

вычерчивает текущим цветом отрезок прямой между точками с координатами (x1, y1) и (х2, у2).

Одного этого метода достаточно, чтобы, нарисовать любую картину по точкам, вычерчивая каждую точку с координатами (х, у) методом drawLine (x, у, х, у) и меняя цвета от точки к точке. Но никто, разумеется, не станет этого делать.