Языки программирования
<<  Основы программирования на языке Java Графика в Java  >>
Многопоточные приложения в Java
Многопоточные приложения в Java
Диаграмма состояний потока
Диаграмма состояний потока
Пример состояния гонок
Пример состояния гонок
Пример состояния гонок
Пример состояния гонок
Пример состояния гонок
Пример состояния гонок
Пример
Пример
Картинки из презентации «Многопоточные приложения в Java» к уроку информатики на тему «Языки программирования»

Автор: Карабцев. Чтобы познакомиться с картинкой полного размера, нажмите на её эскиз. Чтобы можно было использовать все картинки для урока информатики, скачайте бесплатно презентацию «Многопоточные приложения в Java.ppt» со всеми картинками в zip-архиве размером 590 КБ.

Многопоточные приложения в Java

содержание презентации «Многопоточные приложения в Java.ppt»
Сл Текст Сл Текст
1Многопоточные приложения в Java. 13оказывается в работоспособном состоянии.
Лекция №7. Работоспособный поток может в данный
2Многопоточность. Многопоточность момент выполняться, а может и нет (зависит
операционной системы – возможность от ОС, поэтому он не называется
одновременного выполнения более чем одной работающим).
программы. Число одновременно 14Состояние потока. Когда поток
выполняющихся процессов не ограничено заблокирован или находится в состоянии
количеством процессоров. Многопоточные ожидания, он временно не активен. Он не
программы расширяют идею многозадачности. выполняет никакого кода, потребляет
Индивидуальные приложения могут выполнять минимум ресурсов. Блокированный. Когда
множество задач в одно и то же время. поток пытается получить внутренний объект
Каждая задача называется потоком – thread. блокировки, он становится блокированным.
3Многопоточность. Существенная разница Поток разблокируется, когда все остальные
между многими процессами и многими потоки освобождают объект блокировки и
потоками заключается в следующем: каждый планировщик потоков позволяет захватить
процесс имеет собственный набор его. Ожидание. Когда поток ожидает другого
переменных, потоки могут разделят одни и потока для уведомления планировщика о
те же данные. Потоки являются более наступлении некоторого условия, он входит
«легковесными», чем процессы. Пример в состояние ожидания. Разница между
многопоточных приложений – браузер, блокированным и ожидающим на практике не
web-сервер, программы с графическим велика.
пользовательским интерфейсом. 15Состояние потока. Временное ожидание.
4Что такое потоки. Рассмотрим Поток входит в это состояние вызовом
программу, которая не использует средства некоторых методов, имеющих параметр
многопоточности. Программа анимирует таймаута. Завершенный поток. Поток
прыгающий мяч. При нажатии кнопки start завершается по одной из следующих причин:
программа выбросит мяч из левого верхнего при нормальном выходе из run()
угла. Обработчик кнопки вызывает метод неперехваченное исключение прерывает метод
addBall(), который содержит цикл из 1000 run() Можно уничтожить поток, вызвав метод
движений. Каждый вызов move() перемещает stop(), который генерирует ошибку
мяч на небольшое расстояние. ThreadDeath. Но данный метод не
5Программный код. // Класс кружок рекомендуется к использованию.
import java.awt.geom.*; public class Ball 16Диаграмма состояний потока.
{ private static final int XSIZE = 15; 17Свойства потока. Приоритет. Поток
private static final int YSIZE = 15; наследует приоритет потока, который его
private double x = 0; private double y = создал. Метод setPriority() устанавливает
0; private double dx = 1; private double приоритет между MIN_PRIORITY (равен 1) и
dy = 1; public void move(Rectangle2D MAX_PRIORITY (равен 10). NORM_PRIORITY
bounds) { x += dx; y += dy; if (x < равен 5. Когда планировщик потоков
bounds.getMinX()) { x = bounds.getMinX(); выбирает поток для выполнения, он
dx = -dx;} …….. // проверки на достижение предпочитает потоки с более высоким
границ } public Ellipse2D getShape() приоритетом (вытесняющее планирование).
{return new Приоритеты потоков в значительной мере
Ellipse2D.Double(x,y,XSIZE,YSIZE); } }. // зависимы от системы. В Windows 7
Панель для хранения и отображения приоритетов, в Sun – приоритеты
//экземпляров класса Ball import игнорируются!
java.awt.*; import java.util.*; import 18Потоки-демоны. Обычный поток можно
javax.swing.*; public class BallComponent превратить в поток-демона вызовом метода
extends JPanel{ ArrayList<Ball> setDemon(true). Демон – поток, основное
balls = new ArrayList<Ball>(); назначение которого - служить другим.
public void add(Ball b) { balls.add(b); } Примеры – поток таймера, отсчитывающего
public void paintComponent(Graphics g) { тики, очистка кэша…
super.paintComponent(g); // очистка экрана 19Синхронизация. В практических
Graphics2D g2 = (Graphics2D) g; for (Ball многопоточных приложениях часто необходимо
b : balls) {g2.fill(b.getShape());} } }. двум или более потокам разделить доступ к
6Программный код. // Класс фрейм, на одним и тем же данным. В такой ситуации
котором все размещается class BounceFrame возникает ошибка – состояние гонки. Чтобы
extends JFrame{ private BallComponent избежать этого, необходимо
comp; public static final int STEPS = синхронизировать доступ! Пример состояния
1000; public static final int DELAY = 3; гонок на следующем слайде.
public BounceFrame() { setSize(450, 350); 20Пример состояния гонок. Банк.
setTitle("Bounce"); comp = new 21Код примера. public class Bank{
BallComponent(); add(comp, private final double[] accounts; public
BorderLayout.CENTER); JPanel buttonPanel = Bank(int n, double initialBalance){
new JPanel(); addButton(buttonPanel, accounts = new double[n]; for (int i = 0;
"Start", new ActionListener() i < accounts.length; i++) accounts[i] =
{public void actionPerformed(ActionEvent initialBalance; } public void transfer(int
event) {addBall();} }); from, int to, double amount){ if
addButton(buttonPanel, "Close", (accounts[from] < amount) return;
new ActionListener() { public void System.out.print(Thread.currentThread());
actionPerformed(ActionEvent event) accounts[from] -= amount;
{System.exit(0);} }); add(buttonPanel, System.out.printf(" %10.2f from %d to
BorderLayout.SOUTH); }. public void %d", mount, from, to); accounts[to]
addButton(Container c, String title, += amount; System.out.printf(" Total
ActionListener listener) { JButton button Balance: %10.2f%n",
= new JButton(title); c.add(button); getTotalBalance()); } public double
button.addActionListener(listener);} getTotalBalance() { double sum = 0; for
public void addBall(){ try{ Ball ball = (double a : accounts) sum += a; return
new Ball(); comp.add(ball); for (int i = sum; } public int size(){ return
1; i <= STEPS; i++) { accounts.length;}}. public class
ball.move(comp.getBounds()); UnsynchBankTest{ public static final int
comp.paint(comp.getGraphics()); NACC = 100; public static final double
Thread.sleep(DELAY);} }catch INIT_BAL = 1000; public static void
(InterruptedException e){;} }} public main(String[] args){ Bank b = new
class Bounce{ public static void Bank(NACC,INIT_BAL); int i; for (i = 0; i
main(String[] args) { < NACC; i++){ TransferRunnable r = new
EventQueue.invokeLater(new Runnable(){ TransferRunnable(b, i, INIT_BAL); Thread t
public void run(){ JFrame frame = new = new Thread(r); t.start();} } }.
BounceFrame(); 22Продолжение кода примера. public class
frame.setDefaultCloseOperation(JFrame.EXIT TransferRunnable implements Runnable{
ON_CLOSE); frame.setVisible(true);}}); } private Bank bank; private int
}. fromAccount; private double maxAmount;
7Процедура запуска задачи в отдельном private int DELAY = 10; public
потоке. Поместить код задачи в метод run() TransferRunnable(Bank b, int from, double
класса, реализующего интерфейс Runnable max){ bank = b; fromAccount = from;
Сконструировать объект вашего класса maxAmount = max; } public void run(){ try{
Сконструировать объект Thread из Runnable while (true){ int toAccount = (int)
Запустить поток. (bank.size() * Math.random()); double
8Модификация для добавления amount = maxAmount * Math.random();
многопоточности. Модифицируем код так, что bank.transfer(fromAccount, toAccount,
бы каждый круг двигался в своем потоке. amount); Thread.sleep((int) (DELAY *
Чтобы поместить программу в отдельный Math.random())); } } catch
поток, необходимо реализовать (добавить (InterruptedException e){ } } }.
новый) класс BallRunnable и поместить код 23Объяснение состояния гонок.
анимации в метод run(). Классы Ball, Предположим, что два потока пытаются
BallComponent, Bounce остаются выполнить одновременно инструкцию
неизменными. В классе BounceFrame account[to] += amount Операция не
модифицируется лишь метод addBall(). атомарна! загрузить accounts[to] в регистр
9Модификация программного кода. // добавить amount перенести результат
Новый класс, реализующий интерфейс class обратно в accounts[to] Первый поток
BallRunnable implements Runnable { private выполняет шаги 1,2, после чего
Ball ball; private Component component; приостанавливается. Второй поток
public static final int STEPS = 1000; просыпается и обновляет тот же элемент
public static final int DELAY = 5; public массива. Затем просыпается первый поток и
BallRunnable(Ball aBall,Component aC) { делает шаг3. В результате шага 3 действия
ball = aBall; component = aC;} public void второго потока уничтожаются.
run() { try { for (int i = 1; i <= 24Блокирующие объекты. Начиная с Java
STEPS; i++){ 5.0 существует 2 механизма для защиты
ball.move(component.getBounds()); блока кода от параллельного доступа –
component.repaint(); Thread.sleep(DELAY);} synchronized и ReentrantLock. Эскиз защиты
} catch (InterruptedException e){} } }. выглядит следующим образом:
//Метод addball до «многопоточности» 25Пример. public void transfer(int from,
public void addball(){ try{ ball ball = int to, double amount){ bankLock.lock();
new ball(); comp.Add(ball); for (int i = try{
1; i <= STEPS; i++) { System.out.print(Thread.currentThread());
ball.Move(comp.Getbounds()); accounts[from] -= amount;
comp.Paint(comp.Getgraphics()); System.out.printf(" %10.2f from %d to
thread.Sleep(delay);} }catch %d", amount, from, to); accounts[to]
(interruptedexception e){;} } //метод += amount; System.out.printf(" Total
addball после введения // Balance: %10.2f%n",
«многопоточности» public void addball(){ getTotalBalance()); } finally{
ball ball = new ball(); comp.Add(ball); bankLock.unlock();}} …. private Lock
runnable r = new ballrunnable(b, comp); bankLock=new ReentrantLock();
thread t = new thread(r); t.Start(); }. 26Объекты условий. Часто поток входит в
10Прерывание потоков. Поток прерывается, критическую секцию для того, чтобы
когда его метод run() возвращает обнаружить, что он не может работать, пока
управление, выполнив оператор return, не будет выполнено определенное условие. В
после последнего оператора или в случае подобных случаях необходимо использовать
возникновения исключения. Для объект условия для управления потоками,
принудительного прерывания вызовом метода которые захватили блокировку, но не могут
interrupt() выставляется статус прерывания выполнить полезную работу. Возможна такая
(interrupted status). Каждый поток ситуация, когда вы сделали проверку
периодически проверяет этот статус. Для возможности выполнения операция (баланс
проверки установки статуса прерывания достаточен), а перед выполнением самой
применяется статический метод операции поток заснул. После его активации
isInterrupted(): баланс уже может быть изменен и операцию
11Прерывание потоков. Если поток по переводу делать нельзя.
блокирован, то он не может проверить 27Объекты условий. Объект блокировки
статус прерывания. Когда метод interrupt() может иметь один или более ассоциированных
вызывается для потока, который с ним объектов условий. Объект условия
заблокирован таким вызовом как sleep() или получается вызовом метода newCondition().
wait(), то блокирующий вызов прерывается Public void transfer (int from, int to,
исключением InterruptedException. public double amount){ banklock.Lock(); try{
void run(){ try{… while(еще есть работа){ while (accounts[from]<amount){ ждать} …
Выполнять работу; Thread.sleep(delay);} } перевод … } finally{ banklock.Unlock();}}.
catch(InterruptedException e){ поток 28Объекты условий. Если метод transfer()
прерван во время ожидания} finally{при обнаружит, что средств на счете
необходимости что-то сделать} }. недостаточно, то он вызовет метод await().
12Прерывание потоков. Не игнорируйте Теперь текущий поток деактивирован и
InterruptedException! Необходимо поступить отдаст блокировку. Как только средств на
одним из двух способов: Выставьте флаг счете станет достаточно, то другой поток
прерывания catch(InterruptedException e) должен активировать первый поток вызовом
{Thread().currentThread().interrupt();} метода signallAll(). public void transfer
Или предупредите метод о возможном (int from, int to, double amount){
исключении через throws bankLock.lock(); try{ while
InterruptedException. (accounts[from]<amount){
13Состояние потока. Существует 6 sufficientFunds.await();}
состояний потока. Новый. Как только поток sufficientFunds.signalAll(); } finally{
был создан операцией new, он находится в bankLock.unlock();}} … private Condition
состоянии “новый”. Работоспособный. Как sufficientFunds;
только вызывается метод start, поток sufficientFunds=bankLock.newCondition();
Многопоточные приложения в Java.ppt
http://900igr.net/kartinka/informatika/mnogopotochnye-prilozhenija-v-java-189290.html
cсылка на страницу

Многопоточные приложения в Java

другие презентации на тему «Многопоточные приложения в Java»

«Java 5» - Сумма чисел. Generic List. Пример использования. Реализация Generic. Double apply. Генерация кода. Static Import. Java Advanced. Сумма чисел в коллекции. Map. Смешение generic и не-generic кода. Подсчет количеств слов. Подсчет количества слов. Пример определения generic-класса. Особенности Autoboxing.

«JavaScript» - Создание пользовательских объектов. Конструктор можно записать короче. Положение по горизонтали. Объект JavaScript - это неупорядоченный набор свойств. Невозможно задать только один размер окна. Function Circle. Метод scroll. Оформление и взаимодействие с пользователем. Ширина. Примеры открытия окон.

«Библиотека шаблонов» - STL - алгоритмы представляют набор готовых функций. Пример использования итератора. Что дает применение функторов. Элементы можно рассматривать как последовательность. Основные концепции стандартной библиотеки шаблонов. Основные виды алгоритмов. О чем пойдет речь. В STL существует понятие адаптированного функтора.

«Характеристика языков программирования высокого уровня» - GNU Pascal. Парадигмы программирования. Более восьми с половиной тысяч языков. Ряд ограничений. Xml-подобные языки. Новые компьютеры. Неклассифицированные языки. Fortran. Языки программирования высокого уровня. Типы данных. Pascal. Prolog. Что делает деривационная семантика. Вопросы. Процедурные языки.

«Язык XSL» - Свойства для “start” и “end”. Внешняя цветовая палитра. Общие свойства абсолютного позиционирования. Количество последовательных строк. Свойство border. Использование. Значение. Общие свойства доступа. Выравнивание последней строки. Позволяет устанавливать высоту отображаемого содержимого объекта. Количество соседних ячеек.

«MDI-приложение» - Дочерние формы. Термин MDI. Меню верхнего уровня. Конструктор. Создание приложения MDI. Свойство. Доступ к созданным дочерним формам. Обработчик. Динамическое создание форм. Классы форм. Родительская форма.

Языки программирования

23 презентации о языках программирования
Урок

Информатика

130 тем
Картинки