Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

2.2 Реализация интерфейса Runnable

Если нет необходимости расширять класс Thread подобно примерам, показанным выше, то можно применить второй способ реализации многозадачности. Допустим, уже существует класс MyClass, функциональные возможности которого удовлетворяют разработчика:

class myClass

{ // код класса - объявление его элементов и методов

..................................................

}

и теперь необходимо, чтобы он выполнялся как отдельный поток. Для этого необходимо для этого класса реализовать интерфейс Runnable, создавая разделяемый метод run() интерфейса Runnable:

class myClass implements Runnable

{ // код класса - объявление его элементов и методов

..................................................

// этот метод получает управление при запуске потока

public void run()

{ // здесь можно добавить код, который будет

// выполняться в рамках отдельного потока

}

}

Рассмотрим пример и продолжим создание апплета MultiTask. Пусть существует класс, предназначенный для вывода случайной линии в окне апплета MultiTask:

class DrawLines

{ // конструктор, получающий ссылку на создателя объекта

public DrawLines(MultiTask parentObj)

{ parent=parentObj;

}

public void draw()

{ int w=parent.size().width-1, h=parent.size().height-1;

Graphics gr=parent.getGraphics();

gr.setColor(new Color((float)Math.random(),

(float)Math.random(),(float)Math.random()));

gr.drawLine((int)(Math.random()*w),(int)(Math.random()*h),

(int)(Math.random()*w),(int)(Math.random()*h));

}

MultiTask parent; // ссылка на создателя объекта

}

Реализуем для этого класса интерфейс Runnable и создадим метод run(), выполняющийся в рамках отдельного потока:

class DrawLines implements Runnable

{ // конструктор, получающий ссылку на создателя объекта

public DrawLines(MultiTask parentObj)

{ parent=parentObj;

}

public void draw()

{ int w=parent.size().width-1, h=parent.size().height-1;

Graphics gr=parent.getGraphics();

gr.setColor(new Color((float)Math.random(),

(float)Math.random(),(float)Math.random()));

gr.drawLine((int)(Math.random()*w),(int)(Math.random()*h),

(int)(Math.random()*w),(int)(Math.random()*h));

}

MultiTask parent; // ссылка на создателя объекта

// этот метод получает управление при запуске потока

public void run()

{ while(true) { draw(); }

}

}

В классе апплета MultiTask объявляется элемент - объект класса Thread:

Thread Lines=null;

Затем в методе start() апплета создается поток Lines, при этом конструктору Thread() передается экземпляр класса DrawLines, реализующего интерфейс Runnable (создание потока с исполняемым адресатом). Далее поток Lines запускается на выполнение:

public void start()

{ if(Rects==null) { Rects=new DrawRects(this); Rects.start(); }

if(Ovals==null) { Ovals=new DrawOvals(this); Ovals.start(); }

if(Lines==null) { Lines=new Thread(new DrawLines(this)); Lines.start(); }

}

Все пооки апплета останавливаются в его методе stop():

public void stop()

{ if(Rects!=null) Rects.stop(); if(Ovals!=null) Ovals.stop();

if(Lines!=null) Lines.stop();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]