Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Заочники 2020-2021 / Лекция 7.ppt
Скачиваний:
67
Добавлен:
15.06.2021
Размер:
884.74 Кб
Скачать

Многопоточность в Java. Пример программы. Класс BallRunnable Лекция 7

class BallRunnable extends Thread { private Ball ball;

private Component component;

public static final int STEPS = 5000; public static final int DELAY = 5; public volatile boolean suspended;

public BallRunnable(Ball aBall, Component aComponent) { ball = aBall; //работаем с конкретным мячиком component = aComponent;

suspended = false;

}

public BallRunnable(Ball aBall, Component aComponent, boolean ThreadOK) { super(aBall.getName());

ball = aBall; //работаем с конкретным мячиком component = aComponent;

suspended = false; start();

}

public void run() { try {

for (int i = 1; i <= STEPS; i++) { makeMoving(); //вызов метода перемещения мячика synchronized(this) {

while(suspended) {

wait(); //пока suspended==true — находимся в режиме ожидания

}

}}

}

catch (InterruptedException e) {

}

}

Многопоточность в Java. Пример программы. Класс BallRunnable

Лекция 7

//Метод перемещения мячика

private synchronized void makeMoving() throws InterruptedException { ball.move(component.getBounds());

component.repaint(); sleep(DELAY);

}

public synchronized void setPause() {

suspended = true; //Устанавливаем признак «пауза» в true

System.out.println("Заморозить");

}

public synchronized void clearPause() {

suspended = false; //Устанавливаем признак «пауза» в false this.notify(); //Сами себе говорим — можно продолжать

System.out.println("Разморозить");

}

}

Многопоточность в Java. Пример программы. Класс ThreadTest Лекция 7

public class ThreadTest extends JInternalFrame implements ActionListener, KeyListener, MouseListener {

private JPanel panel; public static Map App;

private BallComponent BallContainer; private int BallCounter = 0;

private java.util.List <BallRunnable> ArBrun = new ArrayList<>();

public ThreadTest() { super();

//Задаем параметры фрейма

//...

//Добавляем кнопки управления JPanel buttonPanel = new JPanel();

addButton(buttonPanel, "Запуск", new ActionListener() { public void actionPerformed(ActionEvent event) {

addBall();

}

});

addButton(buttonPanel, "Заморозить", new ActionListener() { public void actionPerformed(ActionEvent event) {

try { pauseBall();

} catch (InterruptedException e) { e.printStackTrace();

}

}

});

Многопоточность в Java. Пример программы. Класс ThreadTest

Лекция 7

addButton(buttonPanel, "Разморозить", new ActionListener() { public void actionPerformed(ActionEvent event) {

runBall();

}

});

addButton(buttonPanel, "Скрыть", new ActionListener() { public void actionPerformed(ActionEvent event) {

hideBall();

}

});

//Добавляем панель с кнопками управления во фрейм add(buttonPanel, BorderLayout.SOUTH);

//Создаем и добавляем компонент, который будет содержать мячики BallContainer = new BallComponent();

add(BallContainer, BorderLayout.CENTER);

}

Многопоточность в Java. Пример программы. Класс ThreadTest Лекция 7

public void addBall() {

//При добавлении каждого мячика, добавляем его в контейнер с мячами и запускаем //его скачки в отдельном потоке с помощью объекта BallRunnable

Ball b = new Ball(600, BallCounter+""); //Создаем мячик

BallContainer.add(b); //Помещаем в контейнер с мячиками

//Конструируем объект, исполнение которого должно быть запущено в отдельном потоке, предаем в него мячик и конейнер с мячиками и запускаем поток т. к. в его конструкторе есть start()

BallRunnable r = new BallRunnable(b, BallContainer, true); BallCounter++;

ArBrun.add(r); //Добавляем ссылку на поток в массив потоков

}

public void hideBall() { this.setVisible(false);

}

public void pauseBall() throws InterruptedException { //Прерываем все потоки

for (BallRunnable t : ArBrun) { t.setPause();

}

}

public void runBall() { //Запуск прерванных потоков

for (BallRunnable t : ArBrun) { t.clearPause();

}

}

Многопоточность в Java. Пример программы

Лекция 7

Программа запускает движение нескольких мячиков в прямоугольной области, каждый из которых управляется отдельным потоком. По кнопке «Заморозить» мячики останавливаются. По кнопке «Разморозить» продолжают движение.

Многопоточность в Java. Пример программы 2

Лекция 7

Главный класс:

package TestThreads;

import java.lang.Thread.State;

 

 

public class Start {

 

public static void main(String[] args) throws InterruptedException {

 

// TODO Auto-generated method stub

 

Res r = new Res();

 

Trd t1 = new Trd("t1", r);

 

Trd t2 = new Trd("t2", r);

 

Trd t3 = new Trd("t3", r);

 

System.out.println("Start");

 

//В цикле проверяем потоки на пазе и перезапускаем их

 

do {

 

Thread.sleep(500);

 

if(t1.getState() == State.WAITING) {

 

t1.reRun();

 

}

 

if(t2.getState() == State.WAITING) {

 

t2.reRun();

 

}

 

if(t3.getState() == State.WAITING) {

 

t3.reRun();

 

}

 

System.out.println("t1 t2 t3"+t1.getState()+" "+t2.getState()+" "+t3.getState());

 

} while(t1.isAlive() || t2.isAlive() || t3.isAlive());

 

System.out.println("\n Final: t1 t2 t3"+t1.getState()+" "+t2.getState()+"

 

"+t3.getState());

 

}

 

}

Многопоточность в Java. Пример программы 2

Лекция 7

Класс ресурса:

package TestThreads;

public class Res {

 

 

//Класс ресурса

 

synchronized int getResource() {

 

//Метод иммитирует возврат "результата" из ресурса

 

int Result = 0;

 

System.out.println("getResource "+Thread.currentThread().getName());

 

return Result;

 

}

 

synchronized boolean checkResource() {

 

/*

 

Метод иммитирует запрос на готовность ресурса вернуть результат,

 

случайным образом возвращая true или false

 

*/

 

boolean Result = false;

 

double d = Math.random();

 

try {

 

Thread.sleep(500);

 

if( d > 0.5 ) {

 

Result = true;

 

} else {

 

Result = false;

 

}

 

} catch (InterruptedException e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

System.out.println("checkResource "+Thread.currentThread().getName()+" "+d+"

 

"+Result);

 

return Result;

 

}

 

}

Многопоточность в Java. Пример программы 2

Лекция 7

Класс потока:

package TestThreads;

public class Trd extends Thread {

 

 

Res r;

 

volatile boolean pause = false;

 

Trd(String name, Res r) {

 

super(name);

 

this.r = r;

 

this.start();

 

}

 

public void run() {

 

try {

 

System.out.println("Start "+this.getName());

 

this.checkResource(); //Проверяем готовность ресурса

 

synchronized(this) {

 

while(pause) {

 

this.wait(); //Стаивм поток на паузу

 

}

 

}

 

r.getResource(); //Получаем данные из ресурса

 

this.sleep(1000);

 

} catch (InterruptedException e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

}

 

synchronized private boolean checkResource() {

 

//Проверяем готовность ресурса

 

if(!r.checkResource()) {

 

pause = true;

 

} else {

 

pause = false;

 

//notify();

 

}

 

return pause;

 

}

 

synchronized public void reRun() {

 

//Запускаем поток после паузы

 

pause = false;

 

notify();

 

}

 

}

Многопоточность в Java. Пример программы 2

Лекция 7

Вывод программы:

Start Start t3 Start t1 Start t2

t1 t2 t3BLOCKED BLOCKED TIMED_WAITING checkResource t3 0.9893675835156172 true getResource t3

t1 t2 t3TIMED_WAITING BLOCKED TIMED_WAITING checkResource t1 0.191123603753386 false

t1 t2 t3RUNNABLE TIMED_WAITING TIMED_WAITING checkResource t2 0.9593593983864594 true getResource t2

getResource t1

t1 t2 t3TIMED_WAITING TIMED_WAITING TERMINATED

t1 t2 t3TIMED_WAITING TIMED_WAITING TERMINATED

t1 t2 t3TERMINATED TERMINATED TERMINATED

Final: t1 t2 t3TERMINATED TERMINATED TERMINATED

Соседние файлы в папке Заочники 2020-2021