- •Основы Java
- •GUI в Java. Панели инструментов
- •GUI в Java. Панели инструментов
- •GUI в Java. Панели инструментов. Пример. Лекция 7
- •GUI в Java. Диалоговые (модальные) окна
- •GUI в Java. Диалоговое окно JOptionPane
- •GUI в Java. Диалоговое окно JOptionPane
- •GUI в Java. Параметры JoptionPane
- •GUI в Java. События мыши, клавиатуры, окна
- •GUI в Java. Пример «слушания» событий мыши и клавиатуры
- •GUI в Java. Пример «слушания» событий мыши и клавиатуры
- •Основы Java
- •Многопоточность. Понятия и определения
- •Многопоточность. Понятия и определения
- •Многопоточность в Java.
- •Многопоточность в Java. Отличие способов «Runnable» от «Thread» Лекция 7
- •Многопоточность в Java. Отличие способов «Runnable» от «Thread» Лекция 7
- •Многопоточность в Java. Состояния потока
- •Многопоточность в Java. Состояния потока
- •Многопоточность в Java. Действия с потоками
- •Многопоточность в Java. Методы класса Thread
- •Многопоточность в Java. Методы класса Thread
- •Многопоточность в Java. Гонки. Синхронизация. Блокировки
- •Многопоточность в Java. Гонки. Синхронизация. Блокировки
- •Многопоточность в Java. Синхронизация. Блокировки
- •Многопоточность в Java. Синхронизация. Передача событий
- •Многопоточность в Java. Пример программы
- •Многопоточность в Java. Пример программы. Классы Лекция 7
- •Многопоточность в Java. Пример программы. Класс Ball
- •Многопоточность в Java. Пример программы. Класс BallComponent Лекция 7
- •Многопоточность в Java. Пример программы. Класс BallRunnable Лекция 7
- •Многопоточность в Java. Пример программы. Класс BallRunnable
- •Многопоточность в Java. Пример программы. Класс ThreadTest Лекция 7
- •Многопоточность в Java. Пример программы. Класс ThreadTest
- •Многопоточность в Java. Пример программы. Класс ThreadTest Лекция 7
- •Многопоточность в Java. Пример программы
- •Многопоточность в Java. Пример программы 2
- •Многопоточность в Java. Пример программы 2
- •Многопоточность в Java. Пример программы 2
- •Многопоточность в Java. Пример программы 2
Многопоточность в 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