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

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();

}

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