 |
 |
 |
Интернет клуб
Новая страница
Описание html
Javascript
Java в примерах
Что такое JAVA?
Первое приложение на JAVA
Первый апплет на JAVA
Управление шрифтами
Строковые переменные
Работа с массивами
Работа с графикой
Операции с мышкой
Операции с клавиатурой
Структура апплета
Работа с потоками
Передача параметров в апплет
Загрузка изображения в апплет
Контроль за ходом загрузки изображения
Двойная буферизация
Создание изображения из массива данных
Корректировка изображения
Полезные сайты
Задайте вопрос
|
 |
 |
 |
Web-учебник. Раздел 4. Java в примерах.
Работа с потоками
Последовательность операторов, которые выполняет обьект, называется потоком.
Каждый из рассмотренных до сих пор апплетов выполнял один поток.
JAVA позволяет выполнять в апплете одновременно 2 и более потоков. Например, один поток строит "бегущую строку", второй показывает картинки, третий исполняет музыку и т. д. Такой апплет называется многопоточным.
Браузер быстро переключается с одного потока на другой, создавая иллюзию одновремееной работы потоков.
Многопоточная система в JAVA базируется на классе Thread и интерфейсе Runnuble . При создании потока программа либо расширяет класс Thread , либо реализует интерфейс Runnuble .
Мы рассмотрим примеры с интерфейсом Runnuble .
Приведенный ниже апплет MyFirstThread выводит движущуюся строку, используя один поток.
В классе Thread следует перекрыть метод run() , который в интерфейсе Runnuble является абстрактным. Внутри метода run() помещаются операторы, которые должны выполняться в потоке.
Метод run() может обьявлять переменные, вызывать другие методы и использовать другие классы. По концу метода поток завершает работу.
Метод run() вызывается методом start() .
Разберем нижеприведенный пример.
Обьявляем переменную t типа класс.
Строковая переменная name служит для хранения текста, который будет двигаться.
В строковую переменную name1 запишем исходный текст. Я пытался записать русский текст, но в апплете русский язык превращается в какме-то квадраты - в общем, кто знает, можно ли русифицировать апплеты - отзовитесь!!!
В методе start() создается экземпляр класса Thread.
Метод start() класса Thread вызывает метод run().
Далее рассмотрим метод run().
Присваиваем переменной name значение движущегося текста. Строго говоря, можно было бы работать непосредственно с переменной name1 , но просто я всегда придерживался святого правила: не менять исходных значений переменных. Если при определении переменной задается ее значение, то его менять не надо. Поэтому я и ввел вторую текстовую переменную name . А уж с ней я буду делать что хочу.
Команда while (true) создает бесконечный цикл, который будет выполняться до завершения работы апплета.
Методы try и catch служат для обработки исключений. Дело в том, что для регулирования скорости прокрутки текста далее идет метод
sleep(100), который выполняет приостановку работы на 100 миллисекунд (0,1 секунды) при каждом сдвиге. Если по каким-то причинам эта функция прерывается неожиданно, то воэникает исключительная ситуация InterruptException . Обработка этой исключительной ситуации выполняется следующим образом: если во время выполнения любой из команд в блоке try возкникнет эта исключительная ситуация, то управление передается блоку catch,
который в нашем примере пустой, то есть программа просто игнорирует эту исключительную ситуацию. Если бы этой обработки try и catch не было, то апплет аварийно завершил бы работу.
Команда
name=name.substring(1) + name.substring(0,1);
сдвигает текст в name на 1 символ вправо: первое слагаемое содержит весь текст начиная со второго символа до конца, а второе слагаемое, дописываемое в конец, содержит первый символ.
Метод repaint() предназначен для вызова метода paint(), который перерисовывает окно апплета.
Метод paint() выводит измененную строку text в окно.
//------------------------------------------------------------
// Program : MyFirstThread
//------------------------------------------------------------
// Author : Katz Yakov
//------------------------------------------------------------
// Date : 14/01/98
//------------------------------------------------------------
import java.awt.*;
import java.applet.*;
//------------------------------------------------------------
// Определение класса MyFirstThread
public class MyFirstThread extends Applet implements Runnable {
// Определение переменной t типа Thread
Thread t = null;
// Определение переменной name, в ноторой будем
// сдвигать текст
String name = new String();
// Определение сдвигаемого текста
String name1 = "To be or not to be - this is the question... ";
// Переопределение метода start() класса Applet
public void start() {
// Создание нового экземпляра класса Thread
if (t == null)
// то есть если экземпляр класса еще не создан
t = new Thread(this);
// Вызов метода start класса Thread
t.start();
}
// Вызов метода run() класса Thread
public void run() {
name = name1;
// организация бесконечного цикла
while (true) {
// Локализация исключительной ситуации
try {
// Сдвиг текста на 1 символ влево
name=name.substring(1) + name.substring(0,1);
// Задержка на 100 миллисекунд
Thread.sleep(100);
// Вызов метода repaint(), который вызывает
// метод paint()
repaint();
// Обработка исключительной ситуации
} catch(InterruptedException e) { }
}
}
// Вызов метода paint класса Applet
// для перерисовки окна апплета
public void paint (Graphics dr) {
dr.drawString(name,30,30);
}
}
Апплет MyFirstThread выглядит следующим образом:
Теперь создадим апплет, создающий 3 различных потока. Каждый из этих потоков выводит движущийся текст с разной скоростью. Первый поток t1 - 1 символ в секунду, второй поток t2 - 3 символа в секунду, третий поток поток t3 - 10 символов в секунду. Каждый поток выводит движущуюся строку в другое место экрана. Поэтому - обратите внимание - метод repaint задает для перерисовки только прямоугольник, ограничивающий движущуюся строку. Да и зачем перерисовывать все окно каждый раз. Конечно, если записать, как в предыдущем примере, метод () repaint без параметров, три потока все равно будут выводиться, но качество изображения несколько ухудшается. Попробуйте.
//------------------------------------------------------------
// Program : MySecondThread
//------------------------------------------------------------
// Author : Katz Yakov
//------------------------------------------------------------
// Date : 14/01/98
//------------------------------------------------------------
import java.awt.*;
import java.applet.*;
//------------------------------------------------------------
// Определение класса MyFirstThread
public class MySecondThread extends Applet implements Runnable {
// Задание переменной, задающей скорость
// движения строки
int Speed;
// Задание переменных, задающих начальные коордтнаты
// выводимого текста
int XBeg = 40;
int YBeg;
// Определение переменных типа Thread
Thread t1 = null;
Thread t2 = null;
Thread t3 = null;
// Определение сдвигаемого текста
String name = "To be or not to be - this is the question... ";
// Определение переменных для каждого потока
String name1 = name;
String name2 = name;
String name3 = name;
// Переопределение метода start() класса Applet
public void start() {
// Создание экземпляр класса Thread
if (t1 == null)
t1 = new Thread(this);
if (t2 == null)
t2 = new Thread(this);
if (t3 == null)
t3 = new Thread(this);
// Вызов метода start класса Thread
// для каждого потока
t1.start();
t2.start();
t3.start();
}
// Вызов метода run() класса Thread
public void run() {
// организация бесконечного цикла
while (true) {
// Проверка номера потока и для каждого потока
// выполнение следующих действий:
// сдвиг текста, начальная координата Y, скорость
if (Thread.currentThread() == t1) {
name1=name1.substring(1) + name1.charAt(0);
YBeg = 50;
Speed = 1000;
}
if (Thread.currentThread() == t2) {
name2=name2.substring(1) + name2.charAt(0);
YBeg = 110;
Speed = 300;
}
if (Thread.currentThread() == t3) {
name3=name3.substring(1) + name3.charAt(0);
YBeg = 170;
Speed = 100;
}
// Локализация исключительной ситуации
try {
Thread.sleep(Speed);
repaint(XBeg - 10, YBeg - 14, 300, 30);
} catch(InterruptedException e) { }
}
}
// Вызов метода paint класса Applet
public void paint (Graphics dr) {
// Задание фонта TimesRoman
Font MyFont = new Font("TimesRoman", Font.BOLD, 14);
dr.setFont(MyFont);
dr.drawString(name1, 20, 50);
dr.drawString(name2, 20, 110);
dr.drawString(name3, 20, 170);
}
}
Апплет MySecondThread выглядит следующим образом:
|
 |
 |
|
 |
 |