Читайте также:
|
|
Зачастую потоки используются для создания простой анимации. Иногда инструкции выполняемые браузером, часто называют потоком выполнения апплета. Апплет может выполнять две и более задач одновременно. Например, вращение логотипа и зажигание заголовков на экране. В таких случаях апплет использует несколько потоков (многопоточный апплет). Один поток вращает логотип, второй – зажигает заголовки. Когда программы используют несколько потоков, они должны выполняться в одно и то же время. Это значит, что браузер должен очень быстро переключаться с одного потока на другой, пока выполняется апплет.
Как большинство тех вещей, которые составляют программы, поток – это объект, который соответствует определению класса. Поток объявляется определением объекта класса Thread (пакет java.lang). Существует два способа для того. Чтобы приложения работали в различных потоках:
- расширение класса Thread
- реализация интерфейса Runnable
Т.е. можно сделать класс поточным, расширив класс java.lang.Thread, при этом получается доступ ко всем методам потоков:
public class SS extends Thread
Другой способ решения задачи – реализация интерфейса Runnable, который имеет только метод run (), то есть класс, реализующий Runnable, должен определить метод run (), именно этот метод выполняет фактическую работу, возложенную на поток:
public class SS extendsApplet implements Runnable
Для запуска объекта Thread программа вызывает функцию start объекта Thread. Данная функция в свою очередь, вызывает функцию объекта run.
Пример бегущей строки
Рассмотрим приложение, реализующее бегущую строку:
// MargueeMessage.java
1 import java. awt.*;
2 import java. applet.*;
3 public class MargueeMessage extends Applet
implements Runnable{
4 Thread MarqueeThread = null;
5 String Message = "Hello, Java!";
6 Font font = new Font ("Courier", Font.BOLD, 20);
7 int x, y;
8 public void init (){
9 x=size ().width;
10 y = size ().height/2;
11 }
12 public void start (){
13 if (MarqueeThread ==null){
14 MarqueeThread = new Thread (this);
15 MarqueeThread.start ();
16 }
17 }
18 public void run (){
19 while (true){
20 x=x-5;
21 if (x == 0)
22 x = size ().width;
23 repaint();
24 try{MarqueeThread.sleep(100);}
25 catch(InterruptedException e) {}
26 }
27 }
28 public void paint (Graphics g){
29 g.setFont (font);
30 g.drawString (Message, x, y);
31 }
32 }
Рис 26.1 Бегущая строка в окне апплета
Используя слово this, апплет создает поток, который соответствует текущему апплету. В данном примере функция апплета start () вызывает метод потока start (), который будет вызывать метод run объекта Thread, в методе run описывается реальный процесс выполняемый потоком.
Функция run организует обычный бесконечный цикл (или пока пользователь не закроет окно апплета)
В рамках данного цикла апплет обновляет координаты х-, у -, координаты определяются с помощью метода size (), и используемые для вывода строки. Каждый раз, когда обновляются координаты вызывается функция repaint, вызывающая paint () для обновления экрана.
Управление скоростью, с которой программа прокручивает текст сообщения, апплет использует функцию thread.sleep для простановки выполнения потока, или временно приостановить работу потока. В случае прерывания sleep, она приводит к исключению InterruptedException, в таком случае функция перехватывает и игнорирует исключения.
Дата добавления: 2015-10-29; просмотров: 96 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Классы адаптеры | | | Классы исключительных ситуаций |