ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» ΡΡ‚Π°Ρ‚ΡŒΠΈ: http://www.javacodegeeks.com/2015/09/concurrency-best-practices.html Автор: Andrey Redko Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ курса β€œAdvanced Java” Π½Π° JavaCodeGeeks. Π”Π°Π½Π½Ρ‹ΠΉ курс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒ Вас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Java Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивно. Π’ Π½Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ слоТныС Ρ‚Π΅ΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΠ΅ понятия, ΠΊΠ°ΠΊ β€œΠ‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°β€ (object creation), β€œΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌβ€ (concurrency), β€œΠ‘Π΅Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡβ€, β€œΠ Π΅Ρ„Π»Π΅ΠΊΡΠΈΡβ€ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Он Π‘ΡƒΠ΄Π΅Ρ‚ вашим ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊΠΎΠΌ Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ мастСрству Π² Java! ΠžΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с Π½ΠΈΠΌ Ρ‚ΡƒΡ‚!

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  2. Нити ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½ΠΈΡ‚Π΅ΠΉ
  3. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, синхронизация ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ.
  4. Futures, Executors (исполнитСли) ΠΈ Thread Pools (объСдинСниС Π½ΠΈΡ‚Π΅ΠΉ).
  5. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.
  6. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Нити

1. ВступлСниС

ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½Π°Ρ ΠΈ многоядСрная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° β€œΠΆΠ΅Π»Π΅Π·Π°β€ сильно влияСт Π½Π° Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ модСль исполнСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² настоящСС врСмя. Π’ стрСмлСнии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всю Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ систСмы, прилоТСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ мноТСство ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π½ΠΈΡ‚Π΅ΠΉ, ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π·Π° рСсурсы ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡ‚ΠΈΠ΅Π²Ρ‹Ρ… систСм приносит ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с доступом ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ сбоям ΠΈ нСпонятным ΠΎΡ‚ΠΊΠ°Π·Π°ΠΌ. Π’ этой части руководства ΠΌΡ‹ рассмотрим, Ρ‡Ρ‚ΠΎ Java ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΉ ΠΈ бСзопасный ΠΊΠΎΠ΄ Π² ΠΌΠΈΡ€Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°.

2. Нити ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½ΠΈΡ‚Π΅ΠΉ

Нити ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ β€œΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ блоками” ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡ‚ΠΈΠ΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Java. Нити ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ β€œΠ»Ρ‘Π³ΠΊΠΈΠΌΠΈ процСссами” ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. КаТдоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Java ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄Π½Ρƒ Π½ΠΈΡ‚ΡŒ, которая называСтся β€œΠ³Π»Π°Π²Π½Π°Ρ Π½ΠΈΡ‚ΡŒβ€ (main thread). КаТдая Java-Π½ΠΈΡ‚ΡŒ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ JVM ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π½ΠΈΡ‚ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Нити Π² Java ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ класса Thread. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ рСкомСндуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΡ‚ΠΈ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ нСпосрСдствСнно экзСмпляры класса Thread (Executors ΠΈ Thread Pools, рассмотрСныС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠΈΠ΅ возмоТности для этого), ΠΎΠ΄Π½Π°ΠΊΠΎ, это ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ: public static void main(String[] args) { new Thread( new Runnable() { @Override public void run() { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } } ).start(); } Или Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм lambda-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Java 8: public static void main(String[] args) { new Thread( () -> { /* Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит */ } ).start(); } НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ созданиС Π½ΠΎΠ²ΠΎΠΉ Π½ΠΈΡ‚ΠΈ выглядит ΠΎΡ‡Π΅Π½ΡŒ просто, Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ слоТный ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… состояний: БостояниС Π½ΠΈΡ‚ΠΈ_____________ОписаниС NEW________________________ΠΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π°. RUNNABLE___________________ΠΠΈΡ‚ΡŒ выполняСтся Π² JVM. BLOCKED____________________ΠΠΈΡ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΎΠΌ. WAITING____________________ΠΠΈΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° другая Π½ΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ дСйствиС. TIMED_WAITING______________ΠΠΈΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° другая Π½ΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ дСйствиС. TERMINATED_________________ΠΠΈΡ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ //Π’Π°Π±Π»ΠΈΡ†Π° 1. НС всС состояния Π½ΠΈΡ‚ΠΈ понятны прямо сСйчас, Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, Π² руководствС, ΠΌΡ‹ пройдСмся ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΈΠ· Π½ΠΈΡ… ΠΈ обсудим, ΠΊΠ°ΠΊΠΈΠ΅ события Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρƒ Π½ΠΈΡ‚ΠΈ Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ состояниС. Нити ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ собраны Π² Π³Ρ€ΡƒΠΏΠΏΡ‹. Π“Ρ€ΡƒΠΏΠΏΠ° Π½ΠΈΡ‚Π΅ΠΉ прСдставляСт собой мноТСство Π½ΠΈΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½ΠΈΡ‚Π΅ΠΉ (Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, формируСтся Π΄Π΅Ρ€Π΅Π²ΠΎ). Π“Ρ€ΡƒΠΏΠΏΡ‹ Π½ΠΈΡ‚Π΅ΠΉ создавались ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ инструмСнт, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π² наши Π΄Π½ΠΈ ΠΎΠ½ΠΈ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ΡΡ для использования ΠΊΠ°ΠΊ исполнитСли ΠΈ ΠΏΡƒΠ»Ρ‹ Π½ΠΈΡ‚Π΅ΠΉ (поТалуйста, посмотритС Π³Π»Π°Π²Ρƒ 4)ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ.

3. ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ, синхронизация ΠΈ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ

Π’ практичСски ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΈΡ‚Π΅ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΡ… взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΏΡ€ΠΈ доступС ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ. Π§Ρ‚Π΅Π½ΠΈΠ΅ этих Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ являСтся большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΡ… нСсогласованныС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ - это прямая Π΄ΠΎΡ€ΠΎΠ³Π° ΠΊ катастрофС (Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ состояниС Π³ΠΎΠ½ΠΊΠΈ). Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‚ самый случай, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° синхронизация. Бинхронизация - это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Ρ… (синхронизированных - synchronized) Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ воздСйствия Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π½ΠΈΡ‚Π΅ΠΉ. Если ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ‚Π΅ΠΉ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ синхронизированный Π±Π»ΠΎΠΊ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½ΠΈΡ‚ΠΈ, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π»ΠΎΠΊ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° пСрвая Π½ΠΈΡ‚ΡŒ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π½ΠΈΠΌ. Java ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ", ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову synchronized. Π­Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΎ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ класса, статичСским ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π° гарантируя, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‚ΠΈ Π½Π΅ смогут Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. НапримСр: public synchronized void performAction() { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } public static synchronized void performClassAction() { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } Или, Π² качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ синхронизации Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π°: public void performActionBlock() { synchronized( this ) { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } } БущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΉ эффСкт ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова synchronized: ΠΎΠ½ΠΎ автоматичСски устанавливаСт happens-before взаимосвязь (http://en.wikipedia.org/wiki/Happened-before) с Π»ΡŽΠ±Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΎΠΌ ΠΊΠΎΠ΄Π° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌ словом synchronized. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ измСнСния состояний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ всСм нитям. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ конструкторы Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ синхронизированы (использованиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова synchronized для конструктора Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ компиляции), ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΠΈΡ‚ΡŒ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ экзСмпляр класса ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Π½Π΅ΠΌΡƒ, ΠΏΠΎΠΊΠ° ΠΎΠ½ (экзСмпляр) строится. Π’ Java синхронизация основана Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ сущности, ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€(monitor) (ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, http://en.wikipedia.org/wiki/Monitor_(synchronization)). ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ обСспСчиваСт Π΅Π΄ΠΈΠ½ΠΎΠ»ΠΈΡ‡Π½Ρ‹ΠΉ доступ ΠΊ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ устанавливаСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ happens-before. Когда какая-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ synchronized-ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠ½Π° автоматичСски Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€) этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (ΠΈΠ»ΠΈ класса, Π² случаС static-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²) ΠΈ освобоТдаСт Π΅Π³ΠΎ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. НаконСц, синхронизация Π² Java являСтся Π Π΅Π΅Π½Ρ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΉ: это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π Π΅Π΅Π½Ρ‚Π΅Ρ€Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ модСль прораммирования ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡ‚Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Ρƒ Π½ΠΈΡ‚ΠΈ мСньшС шансов Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ саму сСбя. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ Π΄Π΅Π»Π°Π΅Ρ‚ Java-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ слоТным. Однако, Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄: Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ(immutability). ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎΠ± этом ΡƒΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·, Π½ΠΎ это ΠΏΡ€Π°Π²Π΄Π° ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ для ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡ‚Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ: Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ синхронизации, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½Ρƒ Π½ΠΈΡ‚ΡŒ.

4. Futures, Executors (исполнитСли) ΠΈ Thread Pools (ΠΏΡƒΠ»Ρ‹ Π½ΠΈΡ‚Π΅ΠΉ)

Π’ Java Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π½ΠΈΡ‚ΠΈ, Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ ΠΎΡ‡Π΅Π½ΡŒ нСпросто. Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java прСдоставляСт Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ абстракции Π² Π²ΠΈΠ΄Π΅ executors (исполнитСлСй) ΠΈ thread pools (ΠΏΡƒΠ»ΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ), ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ управлСния нитями. По сущСству, Π² своСй ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ thread pool создаСт ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ список Π½ΠΈΡ‚Π΅ΠΉ, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡƒ использованию. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, вмСсто постоянного создания Π½ΠΎΠ²Ρ‹Ρ… Π½ΠΈΡ‚Π΅ΠΉ, просто Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ (ΠΈΠ»ΠΈ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ) ΠΈΠ· ΠΏΡƒΠ»Π°. ΠΠΈΡ‚ΡŒ, Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ²ΡˆΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Ρƒ, возвращаСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡƒΠ» ΠΈ становится доступной для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡. Π₯отя ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΡƒΠ»ΠΎΠΌ Π½ΠΈΡ‚Π΅ΠΉ нСпосрСдствСнно, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java прСдоставляСт ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ проСктирования, содСрТащиС мноТСство ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для создания Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΏΡƒΠ»ΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ. НапримСр, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅ создаСт ΠΏΡƒΠ» Π½ΠΈΡ‚Π΅ΠΉ с фиксированным количСством Π½ΠΈΡ‚Π΅ΠΉ(10): ExecutorService executor = Executors.newFixedThreadPool( 10 ); Π˜ΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΠΈ (Executors) ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Ρ€Π°Π·Π³Ρ€ΡƒΠ·ΠΊΠΈ любой Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚.ΠΊ. ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ ΠΈΠ· ΠΏΡƒΠ»Π° Π½ΠΈΡ‚Π΅ΠΉ (Π½Π° Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ: это Π½Π΅ рСкомСндуСтся для использования с Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ). Π¨Π°Π±Π»ΠΎΠ½Ρ‹ проСктирования исполнитСлСй ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π»Π΅ΠΆΠ°Ρ‰Π΅Π΅ Π² основС ΠΏΡƒΠ»ΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: ΠœΠ΅Ρ‚ΠΎΠ΄_______________________________________ОписаниС Executors.newCachedThreadPool_______________Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° Π½ΠΈΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π½ΠΎΠ²ΡƒΡŽ ____________________________________________Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π½Π΅Π΅ ____________________________________________созданныС Π½ΠΈΡ‚ΠΈ, Ссли ΠΎΠ½ΠΈ доступны. Executors.newFixedThreadPool________________Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° Π½ΠΈΡ‚Π΅ΠΉ содСрТащСго фиксированноС ____________________________________________число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π² ΠΎΠ±Ρ‰Π΅ΠΉ, ____________________________________________Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Executors.newScheduledThreadPool____________Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡƒΠ»Π° Π½ΠΈΡ‚Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ____________________________________________запуском ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ____________________________________________пСриодичСски. Executors.newSingleThreadExecutor___________Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π˜ΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ____________________________________________ΠΎΠ΄Π½Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ Π½ΠΈΡ‚ΡŒ с Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ. Executors.newSingleThreadScheduledExecutor__Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ½ΠΈΡ‚Π΅Π²ΠΎΠ³ΠΎ исполнитСля ____________________________________________ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запуском ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ____________________________________________Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ΅ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ пСриодичСски. //Π’Π°Π±Π»ΠΈΡ†Π° 2 Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ΅Π½, Ρ‚ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сСмантику fire-and-forget, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: executor.execute( new Runnable() { @Override public void run() { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } } ); Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ Π½Π° Java 8 Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅: executor.execute( new Runnable() { @Override public void run() { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит } } ); Но Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π²Π°ΠΆΠ΅Π½, стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java прСдоставляСт Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰ΡƒΡŽ вычислСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Future<Π’>. НапримСр: Future< Long > result = executor.submit( new Callable< Long >() { @Override public Long call() throws Exception { // Π—Π΄Π΅ΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит return ...; } } ); Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ <Future<Π’> Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доступСн Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Π΄ΠΎΡ‚Ρ‹ get(…)-Ρ‚ΠΈΠΏΠ°. НапримСр: Long value = result.get( 1, TimeUnit.SECONDS ); Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСний Π½Π΅ доступСн Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ врСмя, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TimeoutException. БущСствуСт пСрСгруТСнная вСрсия get(), которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π²Π΅Ρ‡Π½ΠΎ, Π½ΠΎ, поТалуйста, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Ρƒ, с Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠΌ. Начиная с Ρ€Π΅Π»ΠΈΠ·Π° Java 8, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Future<Π’> - CompletableFuture<Π’>, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС Π΅Ρ‘ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. И Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это. Π‘ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ stream'ΠΎΠ², Java 8 Π²Π²Π΅Π»Π° ΠΎΡ‡Π΅Π½ΡŒ простой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ parallelStream(), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: final Collection< String > strings = new ArrayList<>(); // Some implementation here final int sumOfLengths = strings.parallelStream() .filter( str -> !str.isEmpty() ) .mapToInt( str -> str.length() ) .sum(); ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ исполнитСли ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ привнСсли Π² Java, Π΄Π΅Π»Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Java Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Π³Ρ‡Π΅. Но Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ созданиС ΠΏΡƒΠ»ΠΎΠ² Π½ΠΈΡ‚Π΅ΠΉ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ свСсти ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния Π½Π° Π½Π΅Ρ‚, поэтому Π²Π°ΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠΌΠΈ Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎ.

5. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€Π°ΠΌ, Java ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.