Добавил:
ИВТ (советую зайти в "Несортированное") Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
23.11.2024
Размер:
888.32 Кб
Скачать

Многопоточность в Java. Методы класса Thread

Лекция 7

Ожидание окончания потока

join() - ожидать завершения

join(long mills) — ожидать до завершения или истечения mills миллисекунд

join(long mills, long nanos) - ожидать до завершения или истечения mills миллисекунд и nanos наносекунд

Методы ожидания бросают InterruptedException

class MyThread implements Runnable { Thread thrd;

}

MyThread flow1 = new MyThread("Potok #1");

MyThread flow2 = new MyThread("Potok #2");

try {

flow1.thrd.join(); //Основной поток ждет пока выполнится flow1 flow2.thrd.join(); //Основной поток ждет пока выполнится flow2

}

catch(InterruptedException exp) { System.out.println("Прерывание основного потока");

}

System.out.println("Завершение основного потока");

Многопоточность в Java. Методы класса Thread

Лекция 7

Прерывание потока

interrupt() - установить флаг прерывания isInterrupted() — проверить флаг перывания iterrupted() - проверить и сбросить флаг прерывания

Методы, которые ожидают в процессе выполнения должны бросать

InterruptedException

class MyThread implements Runnable { Thread thrd;

public void run() { try{

while(!thrd.interrupted()) { //Исполняемый код

}

} catch (InterruptedException exp) { //Исполнение потока прервано

}

}

}

Многопоточность в Java. Гонки. Синхронизация. Блокировки

Лекция 7

Состояние «гонок» возникает, когда несколько потоков обращаются к одному и тому-же объекту (данным)

Это может привести к повреждению данных. Например, если использовать два потока для копирования символов из файла «A» в файл «B», то в результате в файле «B» символы будут перемешаны.

Это означает, что требуется создать механизмы синхронизации такие, чтобы потоки могли управлять общими ресурсами т. е. действовать синхронно.

Требование синхронности обязывает ввести в язык конструкции, которые бы могли приостанавливать поток до исполнения некоторого условия (или промежутка времени) и запускать потоки при его исполнении, а также конструкции, которые бы

показывали — какой код (данные) внутри класса следует сделать не исполняемым (заблокированным) до исполнения условия.

В Java для этого используется ключевое слово synhronized и методы join(), wait(), notify() и notifyAll().

Эти методы определены на уровне объекта Object, поэтому все объекты в Java могут быть использованы для работы в многопоточном режиме.

Многопоточность в Java. Гонки. Синхронизация. Блокировки

Лекция 7

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

1.Только один поток может владеть блокировкой

2.Любой объект может служить (быть источником) блокировки

3.Снятие блокировки производится автоматически

synchronized (this) { //Получение блокировки

} //Снятие блокироки

Т.е. блокировка возникает при передаче управления внутрь блока кода или метода «помеченного» словом synhronized

За соблюдением блокировки следит специальная встроенный в каждый объект Java механизм, называемый монитором. Монитор контролирует доступ к объекту.

Если объект заблокирован одним потоком, то он недоступен другим потокам.

Многопоточность в Java. Синхронизация. Блокировки

Лекция 7

Пример определения синхронизированного метода

public synchronized void setPause() { suspended = true; System.out.println("Заморозить");

}

Пример определения синхронизированного блока кода

synchronized(this) { //Исполняемый код

}

Синхронизированный код в каждый момент времени может выполняться только одним потоком.

Поэтому если два потока обращаются одному коду, то «опоздавший» поток ждет, пока этот код не отработает для «опередившего» потока

Многопоточность в Java. Синхронизация. Передача событий

Лекция 7

Перевод потока в режим ожидания

wait() - переводит поток в режим ожидания до получения уведомления wait(long ms) — тоже или по истечении ms миллисекунд

wait(long ms, ns) — тоже или по истечении ms миллесекунд и ns - наносекунд

wait бросает InterruptedException

Перевод потока из режима ожидания в режим исполнения

notify() - запускает к выполнению следующий ожидающий поток notifyAll() - запускает к выполнению поток с наивысшим приоритетом

Ожидающие разблокировки потоки получают информацию о том, что потока ресурс освобожден, тогда, когда внутри него вызывается метод notify() (или notifyAll() )

public synchronized void clearPause() { suspended = false;

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

}

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

Лекция 7

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

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

Ball — рисует мячик (метод getShape()) и перемещает мячик (метод move())

BallComponent — добавляет мячик (Ball) в компонент и присваивает номер

BallRunnuble — создает, запускает и сполняет поток для конкретного мячика (Ball)

ThreadTest — создает окно, загружает в него BallComponent (все мячики), загружает кнопки и их обработчики: «Запустить новый мячик», «Заморозить мячики», «Разморозить мячики»

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

Лекция 7

public class Ball

{

private static final int XSIZE = 15; private static final int YSIZE = 15; private double x = 0;

private double y = 0; private double dx = 1; private double dy = 1; private String Name = "";

Ball(int maxX, String Name) { super();

x = (double) Math.random()*maxX; this.Name = Name;

}

//Получаем прямоугольник, для расчета координат перемещения и контроля границ отскока public void move(Rectangle2D bounds) {

x += dx; y += dy;

if (x < bounds.getMinX()) { x = bounds.getMinX(); dx = -dx;

}

//И другой код контроля границ

}

public Ellipse2D getShape() {

return new Ellipse2D.Double(x, y, XSIZE, YSIZE);

}

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

public class BallComponent extends JComponent

{

private static final int DEFAULT_WIDTH = 250; private static final int DEFAULT_HEIGHT = 250;

private java.util.List<Ball> balls = new ArrayList<>();

public void add(Ball b)

{

//Добавляем мячик к списку мячиков balls.add(b);

}

public void paintComponent(Graphics g)

{

//Рисует все добавленные мячики Graphics2D g2 = (Graphics2D) g; for (Ball b : balls)

{

g2.fill(b.getShape()); //Дописываем номер

g2.drawString(b.getName(), (int) b.getX(), (int) b.getY());

}

}

public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH,

DEFAULT_HEIGHT); }

}

Соседние файлы в папке Лекции