Содержание
- 2. Взаимоблокировка потоков Если имеются два потока и два объекта, подлежащих блокированию, возникает опасность возникновения взаимоблокировки —
- 3. Рассмотрим пример: class Friends { private Friends partner; private String name; public Friends(String name){ this.name =
- 4. Далее возможен следующий сценарий: public static void main(string[] args) { final Friends jareth = new Friends("jareth");
- 5. Таким образом имеется следующий сценарий: Thread 1 вызывает synchronized метод jareth.hug(); теперь thread 1 владеет блокировкой
- 6. 4) наконец,cory.hug() вызывает synchronized-метод jareth.hugBack(); thread 2 приостанавливает выполнение, переходя в стадию ожидания возможности захвата блокировки
- 7. Завершение выполнения потока О потоке, приступившем к работе, говорят как о действующем (alive), и метод isAlive
- 8. Возврат из метода run посредством return или в результате естественного завершения кода — это нормальный способ
- 9. Многими java машинами метод destroy не поддерживается, и его вызов влечет выбрасывание исключения типа NoSuchMethodError, способного
- 10. Для завершения потока вызывается метод interrupt, и код соответствующего потока должен сам следить за событием прерывания
- 11. Рассмотрим пример: class Main extends Thread { static int howOften; Thread th; String word; Main(String whatToSay)
- 12. Метод interrupt сам по себе не принуждает поток прекращать свою деятельность, хотя часто прерывает спящий режим
- 13. 3) interrupted() - статический метод, проверяющий, выполнялось ли прерывание текущего потока, и очищающий "состояние прерывания" потока.
- 14. Другими словами, если поток в момент прерывания его работы с помощью interrupt выполняет один из этих
- 15. Метод tick выводит на экран символ точки count раз, "засыпая" после каждой операции на период времени,
- 16. Ожидание завершения работы потока Поток способен ждать завершения работы другого потока, используя одну из разновидностей метода
- 17. class showjoin { public static void main(string[] args){ CalcThread calc = new CalcThread(); calc.start() ; …………………………..
- 18. Выход из join определенно означает, что работа метода CalcThread.run завершена и значение result может быть использовано
- 19. 2. public final void join(long millis, int nanos) throws InterruptedException Более чувствительная версия метода. Величина интервала
- 20. Потоки – демоны. Существуют два вида потоков — пользовательские (user) и потоки - демоны (daemon). Наличие
- 21. Для придания потоку статуса демона необходимо вызвать метод setDaemon(true), определенный в классе Thread. Проверить принадлежность потока
- 22. Рассмотрим пример: class T extends Thread { public void run() { try { if (isDaemon()){ System.out.println("старт
- 23. public class DemoDaemonThread { public static void main(String[] args) throws InterruptedException { T tr = new
- 24. Квалификатор volatile Язык гарантирует, что операции чтения и записи любых значений, кроме относящихся к типам long
- 25. Рассмотрим пример: int currentvalue = 5; for (;;) { display.showValue(currentvalue); Thread.sleep(1000); // заснуть на одну секунду
- 26. Класс ThreadGroup Потоки могут объединяться в группы потоков по соображениям улучшения управляемости и безопасности. Одна группа
- 27. Объекты групп могут быть использованы также для задания верхней границы значений приоритетов потоков, относящихся к группе.
- 28. static synchronized void maxThread(Thread thr, int priority){ ThreadGroup grp = thr.getThreadGroup(); thr.setPriority(priority); grp.setMaxPriority(thr.getPriority()- 1); //Мах приоритет
- 29. 2. public ThreadGroup(ТhreadGroup parent, String name) Создает новый объект класса ThreadGroup с указанным именем name в
- 30. 5. public final void setDaemon(boolean daemon) придает текущему объекту группы потоков статус принадлежности к категории групп-демонов
- 31. 8. public final int getMaxPriority() Возвращает ранее заданное значение верхней границы приоритетов выполнения для текущей группы
- 32. 11. public final void destroy() Уничтожает объект группы потоков. Группа не должна содержать потоков, иначе метод
- 33. 13. public int enumerate( Thread[] threadslnGroup, boolean recurse) Заполняет массив threadslnGroup ссылками на объекты действующих потоков
- 34. 14. public int enumerate( Thread[ ] threadslnGroup) метод аналогичен предыдущему при условии enumerate(threadsInGroup true). 15. public
- 35. 17. public int enumerate( ThreadGroup[ ] groupslnGroup) Метод аналогичен предыдущему при условии enumerate(groupslnGroup, true). 18. public
- 36. public static int activeCount() Возвращает количество действующих потоков в группе, к которой относится текущий поток. 2.
- 37. Метод stop() Вызов метода stop приводит к возникновению в соответствующем потоке асинхронного исключения типа ThreadDeath. Объекты
- 38. Переменные ThreadLocal Класс ThreadLocal предоставляет возможность иметь единую логическую переменную, обладающую независимыми значениями в контексте каждого
- 39. public class SomeBuilderDemo { public static class SomeBuilder { private ThreadLocal counter = new ThreadLocal ();
- 40. public static class SomeBuilderThread extends Thread { private SomeBuilder builder; public SomeBuilderThread(SomeBuilder builder) { this.builder =
- 41. public static void main(String[] args) { SomeBuilder builder = new SomeBuilder(); Thread thread1 = new SomeBuilderThread(builder);
- 42. Результат работы: Thread Thread-1 Build some structure... Thread Thread-0 Build some structure... Thread Thread-1 Build some
- 43. В строках if (counter.get() == null) counter.set(0); производится ее инициализация. Важно! т.к. ThreadLocal-переменные изолированы в потоках,
- 44. Когда поток прекращает существование, значения, установленные для этого потока в переменных ThreadLocal, недостижимы и могут быть
- 45. public String toString() Возвращает строковое представление содержимого объекта потока, включающее его наименование, значение приоритета выполнения и
- 46. public String toString() Возвращает строковое представление содержимого объекта группы потоков, включающее его наименование и значение приоритета
- 47. Потоки в J2SE 5.0 Добавлены пакеты классов java.util.concurrent.locks, java.util.concurrent, java.util.concurrent.atomic, возможности которых обеспечивают более высокую производительность,
- 48. Схематично concurrent выглядит следующим образом.
- 49. Concurrent Collections — набор коллекций, более эффективно работающие в многопоточной среде нежели стандартные универсальные коллекции из
- 50. Executors — содержит в себе отличные фрейморки для создания пулов потоков, планирования работы асинхронных задач с
- 51. Concurrent Collections CopyOnWriteArrayList — Потокобезопасный аналог ArrayList, реализованный с CopyOnWrite алгоритмом. Главная идея copy-on-write — при
- 52. СoncurrentNavigableMap — Расширяет интерфейс NavigableMap и вынуждает использовать ConcurrentNavigableMap объекты в качестве возвращаемых значений. Все итераторы
- 53. Queues ConcurrentLinkedQueue — В имплементации используется wait-free алгоритм от Michael & Scott, адаптированный для работы с
- 54. BlockingQueue — При обработке больших потоков данных через очереди становится явно недостаточно использования ConcurrentLinkedQueue. Если потоки,
- 55. Так, например, при добавлении элемента в переполненную queue, один метод кинет IllegalStateException, другой вернет false, третий
- 56. ArrayBlockingQueue — Класс блокирующей очереди, построенный на классическом кольцевом буфере. Помимо размера очереди, доступна возможность управлять
- 57. LinkedBlockingQueue — Блокирующая очередь на связанных нодах, реализованная на «two lock queue» алгоритме: один лок на
- 58. BlockingDeque — Интерфейс, описывающий дополнительные методы для двунаправленной блокирующей очереди. Данные можно вставлять и вытаскивать с
- 59. TransferQueue — Данный интерфейс может быть интересен тем, что при добавлении элемента в очередь существует возможность
- 60. Synchronizers Semaphore — Семафоры чаще всего используются для ограничения количества потоков при работе с аппаратными ресурсами
- 61. import java.util.concurrent.Semaphore; public class Main { public static void main(String args[]) throws Exception { //true –гарантия
- 62. class MyThread implements Runnable { Semaphore sem; String msg; MyThread(Semaphore s, String m) { sem =
- 63. CountDownLatch — Позволяет одному или нескольким потокам ожидать до тех пор, пока не завершится определенное количество
- 64. public class HungryStudent implements Runnable { static CountDownLatch c; public void run() { try { c.await();
- 65. CyclicBarrier- приостанавливает все потоки, которые вызывают его метод await до тех пор, пока их не наберётся
- 66. сlass MyThread extends Thread{ private CyclicBarrier queue; public MyThread(CyclicBarrier queue){ this.queue=queue; } public void run(){ System.out.println("Thread
- 67. class Hello implements Runnable{ public void run(){ System.out.println("Hello"); } } public class Main { public static
- 68. Exchanger — Как видно из названия, основное предназначение данного класса — это обмен объектами между двумя
- 69. Executors Future — Интерфейс для получения результатов работы асинхронной операции. Ключевым методом здесь является метод get,
- 70. FutureTask — Имплементация интерфейса Future/RunnableFuture. Асинхронная операция принимается на вход одного из конструкторов в виде Runnable
- 71. Executor Services Executor — Представляет собой базовый интерфейс для классов, реализующих запуск Runnable задач. Тем самым
- 72. ScheduledExecutorService — В дополнении к методам ExecutorService, данный интерфейс добавляет возможность запускать отложенные задачи. AbstractExecutorService —
- 73. ThreadPoolExecutor & Factory xecutors — Класс-фабрика для создания ThreadPoolExecutor, ScheduledThreadPoolExecutor. Также, тут содержатся разные адаптеры Runnable-Callable,
- 74. ScheduledThreadPoolExecutor — В дополнении к методам ThreadPoolExecutor, позволяет запускать задачи после определенной задержки, а также с
- 75. RejectedExecutionHandler — Позволяет определить обработчик для задач, которые по каким то причинам не могут быть выполнены
- 76. Fork Join В java 1.7 появился новый Fork Join фреймворк для решения рекурсивных задач, работающих по
- 77. RecursiveTask — Абстрактный класс от ForkJoinTask, с объявлением метода compute, в котором должна производиться асинхронная операция
- 78. Completion Service CompletionService — Интерфейс сервиса с развязкой запуска асинхронных задач и получением результатов. Так, для
- 79. Locks Condition — Интерфейс, который описывает альтернативные методы стандарным wait/notify/notifyAll. Объект с условием чаще всего получается
- 80. Класс reentrantLock Лок на вхождение. Только один поток может зайти в защищенный блок. Класс поддерживает «честную»
- 81. Задача Producer-Consumer Имеются один или несколько производителей, генерирующих данные некоторого типа (записи, символы и т.п.) и
- 82. public class ProducerConsumer { final Lock lock = new ReentrantLock(); final Condition emty = lock.newCondition(); final
- 83. public void produce(int value) throws InterruptedException { lock.lock(); try { while (variable != -1) { emty.await();
- 84. public static void main(String[] args) { final ProducerConsumer producerConsumer = new ProducerConsumer(); final Thread consumer =
- 85. ReadWriteLock — Дополнительный интерфейс для создания read/write локов. Такие локи полезны, когда в системе много операций
- 86. AbstractOwnableSynchronizer — Базовый класс для построения механизмов сихнронизации. Содержит всего одну пару геттер/сеттер для запоминания и
- 87. Atomics Атомарные переменные представлены в виде классов, которые реализуют механизм, гарантирующий, что операции с этими переменными
- 88. AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray —За счет использования CAS, операции с этими классами работают быстрее, чем
- 89. Пример. import java.util.concurrent.atomic.AtomicInteger; public class TaskAtomic implements Runnable { private AtomicInteger number; public TaskAtomic() { this.number
- 90. Библиотека Stream java.util.stream введен для поддержки распараллеливания вычислений в потоках. Таким образом теперь потоки делятся на
- 91. Методы stream могут принимать в качестве параметров lambda функции. Рассмотрим пример: List myList = Arrays .asList("a1",
- 92. Можно также использовать of для связки последовательности ссылок объектов: Stream.of("a1", "a2", "a3") .findFirst() .ifPresent(System.out::println); На экране
- 93. IntStream.range(1, 4) .forEach(System.out::println); На экране 1 2 3 Примитивные потоки поддерживают дополнительные терминальные функции avarage() и
- 94. Arrays.stream(new int[] {1, 2, 3}) .map(n -> 2 * n + 1) .average() .ifPresent(System.out::println); На экране
- 95. Stream.of("a1", "a2", "a3") .map(s -> s.substring(1)) .mapToInt(Integer::parseInt) .max() .ifPresent(System.out::println); На экране 3 Примитивные стримы можно преобразовать
- 96. IntStream.range(1, 4) .mapToObj(i -> "a" + i) .forEach(System.out::println); На экране a1 a2 a3 Важнейшая характеристика промежуточных
- 97. Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> { System.out.println("filter: " + s); return true; }); В
- 98. Стримы в Java не допускают повторное использование: Stream stream = Stream.of("d2", "a2", "b1", "b3", "c") .filter(s
- 99. Стримы поддерживают большое количество различных операторов. Рассмотрим пример: class Person { String name; int age; Person(String
- 100. List filtered = persons .stream() .filter(p -> p.name.startsWith("P")) .collect(Collectors.toList()); System.out.println(filtered); Collect преобразовывает последовательность объектов в List,
- 102. Скачать презентацию