Runnable l Thread t new Threadnew Runnable public
Создание потока (Runnable) l Пример кода // Создание потока Thread t = new Thread(new Runnable() { public void run() { System. out. println("Hello"); } }); // Запуск потока t. start(); Georgiy Korneev Java Advanced / Многопоточное программирование на Java 5
Состояния потока Состояние потока возвращается методами int get. State() и boolean is. Alive() класса Thread get. State() NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED Georgiy Korneev is. Alive() + + Java Advanced / Многопоточное программирование на Java 7
Производитель-потребитель (1) l Класс данных class Data { private Object data; public void set(Object data) { … } public Object get() { … } } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 16
Производитель-потребитель (2) l Установка значения public void set(Object data) { while (true) { synchronized (this) { if (data == null) { this. data = data; break; } } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 17
Производитель-потребитель (3) l Получение значения public Object get() { while (true) { synchronized (this) { if (data != null) { Object d = data; data = null; return d; } } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 18
Производитель-потребитель (2) l Установка значения public synchronized void set(Object data) throws Interrupted. Exception { while (data != null) wait(); this. data = data; notify(); } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 22
Производитель-потребитель (3) l Получение значения public synchronized Object get() throws Interrupted. Exception { while (data == null) wait(); Object d = data; data = null; notify(); return d; } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 23
Пример 1 volatile List l = null; t 1() { List l = new Array. List(); l. add(new Object()); this. l = l; } Georgiy Korneev Object t 2() { while (l != null) { return l. get(0); } } Java Advanced / Многопоточное программирование на Java 33
Пример 2 public class Singleton { public static volatile Singleton instance; public Singleton get. Instance() { if (instance == null) { synchronized (Singleton. class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 34
Барьер public await(Barrier that) { // 0 synchronized (this) { // 1 this. generation++; // 2 this. notify(); // 3 } // 4 synchronized (that) { // 5 while (this. generation != that. generation) { // 6 that. wait(); // unlock 7, await 8, lock 9 } // 10 } // 11 } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 37
Гарантированный deadlock public void run() { // 0 synchronized (o 1) { // 1 o 1. notify. All(); // 2 synchronized (o 2) { // 3 try { o 2. wait(); // unlock 4, await 5, lock 6 } catch (Interrupted. Exception e) {} } // 7 } // 8 } Georgiy Korneev Java Advanced / Многопоточное программирование на Java 39
Ссылки JLS. Threads and Locks // http: //java. sun. com/docs/books/jls/third_editio n/html/memory. html l Threads: Doing Two or More Tasks At Once (Java Tutorial) // http: //java. sun. com/docs/books/tutorial/essen tial/threads/index. html l Georgiy Korneev Java Advanced / Многопоточное программирование на Java 43
- Slides: 44