Главная Интернет WEB-учебник Java в примерах


Интернет клуб

Новая страница
Описание 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 выглядит следующим образом:







  ©1996-2007   Megapolis Org   E-mail:   info@megapolis.org