ПредишенСледващото

Наскоро, за пореден път се срещнах с неправилна обработка на InterruptedException в Java. InterruptedException - проверява изключение се генерира от редица методи стандартната библиотека, които блокират притока на изпълнение. Те включват: прекъсваем версия lock'ov. Thread.sleep () метод. Някои операции блокиращи опашки. Някои операции и други канали.

В същността си, InterruptedException показва, че потокът е помолен да си свърши работата. В този случай, вие не се иска незабавно да приключи работата си. От вас се иска да се затвори. Това може да отнеме известно време.

Прекъсване на потока се извършва с използване на метода Thread.interrupt (). Има два начина, по които JVM уведоми поток, който го прекъсва. Първо - това е всъщност InterruptedException. II - знаме на прекъсване на потока. който може да бъде получен чрез Thread.isInterrupted (метод). Без да обръща внимание на втория метод на сигнализация прекъсването и е типична грешка.

Този код е неправилен, защото тя "избутва" сигнал за прекъсване. Ако този код се изпълнява в pool'e на конеца, то това Таско работник (който сте се обадили), ще трябва да довърши изпълнението на задачите, като потокът е била прекъсната. Но това няма да се случи, тъй като сигналът за прекъсване е заловено от горния код. Обикновено, това се отразява във факта, че след изпращане на сигнал убийство Java машината тя увисна worker'ov потоци поради което JVM не може да си свърши работата. В този случай, единственият изход - да убие -9.

Следният код е неправилен, както и, тъй като ние сме "маскира" в прекъсване изключение на друг вид. По този начин, той не позволява на обаждащия се да заключите прекъсване ситуация.

Правилният код е както следва.

Тук ние хване InterruptedException и задайте сигнали флаг за прекъсване на потока.

метод политика прекъсване е част от договора му. Ако декларираме, че InterruptedException не може да се случи по време на изпълнението на метода, но те в същото време се обадите на този метод хвърля изключение можете правилно да конвертирате InterruptedException в потока на прекъсване флаг. Същото важи и за повикващата страна. Ако се обадите на метод, че договорът поражда InterruptedException. след това трябва да се очаква, че методът ще ви уведоми за прекратяването чрез извънредна ситуация. Ако не, тогава със знамето.

Внимателният читател може да поиска: "Защо са два начина на алармата? Не можеш ли да направите едно? ".

Защо ми е необходим Thread.isInterrupted ()?

InterruptedException е неудобно, поради факта, че тя проверява изключение. Това означава, че компилаторът ви принуждава или да се лекува на място, или да посочите в договора ви. Ако не можете да определите InterruptedException в договора ви (например, можете implementiruete интерфейс, където InterruptedException договор Неизвестно) флаг поток е единственият начин за прехвърляне на обаждащия се да прекъсне информация.

Защо ми е необходим InterruptedException?

InterruptedException ви позволява да прекъсне потока на вече извършване на блокиране повикване. Ако методът вече е извършена, има само един начин да го прекъсне, без да се връща никаква стойност, и без да се нарушава договора си - да генерира изключение. В този случай, върнатата стойност от метода е просто неопределено.

Подкрепете проекта - споделете линка, благодаря!