Один из наших читателей, Анант, задал этот чрезвычайно хороший вопрос, чтобы уточнить / перечислить все связанные темы, которые мы должны знать о многопоточности, включая изменения, внесенные в Java 8.(Уровень от начального до продвинутого). Все, что он хотел узнать, это эволюция многопоточного фреймворка в Java от простого интерфейса Runnable до последней функции в Java 8. Давайте решим его вопрос.
Я потратил много времени на сбор всей нижеприведенной информации. Поэтому, пожалуйста, не стесняйтесь предлагать редактирование/обновление нижеприведенной информации, если вы думаете иначе по какому-либо пункту.
Концепции многопоточности в зависимости от версии JDK
Согласно релизу JDK 1.x, в этом первоначальном релизе присутствовало всего несколько классов. Если быть совсем точным, то классы/интерфейсы были:
- java.яз.Нить
- java.lang.Группа потоков
- java.lang.Выполняемый
- java.lang.Процесс
- java.lang.Смерть Потока
- и некоторые классы исключений
например
- java.lang.IllegalMonitorStateException
- java.lang.IllegalStateException
- java.lang.IllegalThreadStateException.
Также имелось несколько синхронизированных коллекций, например java.util.Hashtable.
В JDK 1.2 и JDK 1.3 не было заметных изменений, связанных с многопоточностью.(Поправьте меня, если я что-то упустил).
JDK 1.4, было несколько изменений на уровне JVM для приостановки/возобновления нескольких потоков одним вызовом. Но никаких серьезных изменений API не было.
JDK 1.5 был первым большим релизом после JDK 1.x; и он включал несколько утилит параллельной обработки. Исполнитель, семафор, мьютекс, барьер, защелки, параллельные коллекции и блокирующие очереди; все это было включено в этот релиз. Самое большое изменение в облаке многопоточных приложений Java произошло в этом релизе.
Полный набор изменений можно прочитать по этой ссылке: http://docs.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html
JDK 1.6 был больше исправлением платформы, чем обновлением API. Так что новое изменение присутствовало в JDK 1.6.
В JDK 1.7 добавлена поддержка ForkJoinPool, которая реализовала технику перехвата работы для максимизации пропускной способности. Также был добавлен класс Phaser.
JDK 1.8 в основном известен изменениями Lambda, но также имел несколько изменений в параллелизме. Два новых интерфейса и четыре новых класса были добавлены в пакет java.util.concurrent, например CompletableFuture и CompletionException.
В Java 8 структура коллекций претерпела существенные изменения, добавив агрегатные операции на основе недавно добавленных возможностей потоков и лямбда-выражений. Это привело к добавлению большого количества методов практически во все классы коллекций, а следовательно, и в параллельные коллекции.
Полный набор изменений можно прочитать по этой ссылке: http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/changes8.html
Ссылки:
- https://www.cs.princeton.edu/courses/archive/fall97/cs461/jdkdocs/relnotes/intro.html
- http://programmers.stackexchange.com/questions/147205/какие-были-пакеты-core-api-для-java-1-0
- http://docs.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html
- http://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/changes7.html
- http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
- http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/changes8.html
Надеюсь, приведенные выше списки помогут вам понять возможности многопоточности в зависимости от версии JDK.