- •THREADS
- •1. Выполнение инструкций потоками
- •2. Суперкласс потоков выполнения
- •3. Главный поток
- •4.Статические методы класса Thread
- •5. Имя потока
- •6. Создание и запуск дочернего потока (extends Thread)
- •После создания поток можно запустить на выполнения с помощью метода start класса Thread.
- •7. Создание и запуск дочернего потока (implements Runnable)
- •После этого создают новый поток с помощью конструктора Thread(Runnable target).
- •Замечание. В качестве параметра конструктору Thread может быть передан объект класса, который наследует
- •8. Создание и запуск потока в одном классе
- •9. Запуск потока в конструкторе класса-потока
- •10. Создание и запуск потока с помощью анонимного класса
- •11. Завершение выполнения потока
- •Замечание. Существуют т.н. «потоки-демоны», которые предназначены для обслуживания других потоков.
- •public class test extends Thread {
- •12. Метод sleep класса Thread
- •Метод выбросит исключение InterruptedException, если на потоке для которого он делает паузу вызван
- •public class test extends Thread { public void run() {
- •Замечание. Метод sleep перегружен. Точность времени паузы не гарантируется.
- •13. Метод alive класса Thread
- •public class test extends Thread {
- •14. Пример запуска двух потоков, которые выводят разные сообщения с разной периодичностью
- •public void run() {
- •15. Единственность способа запуска потока.
- •public class test extends Thread { public void run() {
- •Замечание. JVM задает каждому потоку некоторое системное имя при его создании
- •16. Проблема параллельного выполнения одного кода разными потоками
- •public test() { // конструктор создает два потока new Thread() { // создание
- •17. Синхронизация
- •Синхронизация осуществляется с помощью специального объекта-монитора, который связан с этой синхронизацией.
- •18. Монитор синхронизации
- •Замечание. Монитором не может быть null.
- •public class test extends Thread { public synchronized void m() {
- •В предыдущем примере два потока A и B выполняют один и тот же
- •19. Инструкция synchronized
- •20. Метод join класса Thread
- •Замечание. Метод выбрасывает исключение InterruptedException, если в потоке, который его вызвал установить т.н.
- •class test extends Thread { public void run() {
- •21. Метод wait класса Object
- •Метод wait должен вызываться
- •wait может выбросить исключение InterruptedException.
- •public class test extends Thread { // точка входа в поток: public void
- •public static void main(String[] argv) throws Exception {
- •Замечание. Когда поток выполняет метод wait возможны т.н. случайные пробуждения. Поэтому выполнение метода
- •22. Методы notify и notifyAll класса Object
- •На одном и том же мониторе может находиться несколько потоков в режиме ожидания.
- •Замечание. Методы notify и notifyAll определены в классе Object, т.к. монитором потенциально может
- •public class test extends Thread { public void run() {
- •public static void main(String[] argv) throws Exception {
- •23.Блокированное состояние пробужденного потока
- •public class test extends Thread { public void run() {
- •public static void main(String[] argv) throws Exception {
- •24. Совместное использование методов wait и notify/notifyAll
- •public class test extends Thread {
- •public static void main(String[] argv) throws Exception {
- •Замечание. Потоки могут синхронизировать свое выполнение без участия третьего (главного) потока.
- •public void run() {
- •25. Взаимная блокировка
- •public class test extends Thread {
- •public static void main(String[] argv) throws Exception {
- •26. Состояния потоков
- •Состояние "новый":
- •Состояние "остановленный":
- •28. Метод interrupt класса Thread
- •public class test extends Thread { public void run() {
- •public static void main(String[] argv) throws Exception {
- •29. Методы interrupted и isInterrupted класса Thread
- •public static boolean interrupted()
- •30. Изменение значения аргумента блока синхронизации
- •public class test extends Thread {
- •public void run() { try {m();}
- •Программа выведет в стандартный поток вывода следующие строки (с паузой после первой строки
public static void main(String[] argv) throws Exception {
test t = new test(); t.start(); Thread.sleep(500);
//главный поток входит в монитор t
//(= this в строке /*1*/) synchronized (t) {
//и выполняет вызов notify на мониторе
//которым владеет главный поток t.notify();
}
}
}
Kolesnikov D.O. SED KNURE
23.Блокированное состояние пробужденного потока
Если поток находился в состоянии ожидания, выполняя метод wait и был пробужден методом notify/notifyAll то он находиться в блокированном состоянии до тех пор, пока не освободиться монитор и только после этого продолжает выполнять первую инструкцию за методом wait.
Kolesnikov D.O. SED KNURE
public class test extends Thread { public void run() {
// "abc" – уникальный строковый литерал synchronized ("abc") {
try {
// поток вызывает на мониторе // "abc" метод wait
"abc".wait();
// вывод на экран после // выполнения строки /*1*/
System.out.println(
"thread has been notified");
}
catch (Exception e) {e.printStackTrace();}
}
} |
Kolesnikov D.O. SED KNURE |
|
public static void main(String[] argv) throws Exception {
new test().start(); Thread.sleep(500); synchronized ("abc") {
//главный поток вызывает на
//мониторе "abc" метод notifyAll
"abc".notifyAll();
//главный поток переводится в режим
//паузы на примерно на 10 с. /*1*/
Thread.sleep(10000);
}
}
}
Kolesnikov D.O. SED KNURE
24. Совместное использование методов wait и notify/notifyAll
Совместное использование методов notify/notifyAll и wait дает возможность потокам синхронизировать свое выполнение.
Замечание. Если на мониторе нет ожидающих потоков, то вызов методов notify/notifyAll не генерирует никаких исключительных ситуаций.
Kolesnikov D.O. SED KNURE
public class test extends Thread {
public static Object lock = new Object(); private String mes;
public test(String mes) {this.mes = mes;} public void run() {
synchronized (test.lock) { try {
while (true) { test.lock.wait(); test.lock.notify();
System.out.println(this.mes);
}
}
catch (Exception e) {e.printStackTrace();}
}
} |
Kolesnikov D.O. SED KNURE |
|
public static void main(String[] argv) throws Exception {
//после запуска оба потока переходят в
//режим ожидания, выполняя wait
new test("A").start(); new test("B").start();
//пауза, чтобы запущенные потоки успели
//начать выполнение wait
Thread.sleep(500); synchronized (test.lock) {
//для оповещения всех ждущих на
//мониторе потоков нужно вызвать на
//нем метод notifyAll test.lock.notifyAll(); //
}
}
} |
Kolesnikov D.O. SED KNURE |
|
Замечание. Потоки могут синхронизировать свое выполнение без участия третьего (главного) потока.
public class test extends Thread { private String mes;
public test(String mes) {this.mes = mes;}
public static void main(String[] argv) throws Exception {
new test("A").start(); new test("B").start();
}
Kolesnikov D.O. SED KNURE
public void run() {
//монитор - объект класса Class,
//соответствующий классу test synchronized (test.class) {
try {
while (true) { test.class.notify(); test.class.wait(); System.out.println(this.mes);
}
}
catch (Exception e) {e.printStackTrace();}
}
}
}
Kolesnikov D.O. SED KNURE
25. Взаимная блокировка
Потоки могут входить в состояние взаимной блокировки.
Kolesnikov D.O. SED KNURE