Megszakított kivétel
Nemrégiben ismét találkoztam a téves feldolgozással az InterruptedException-ban a java-ban. Az InterruptedException ellenőrzött kivétel, amelyet számos, a végrehajtási szálat blokkoló szabványos könyvtári módszer hoz létre. Ezek közé tartozik: a lock'ov megszakítható változatai. módszer Thread.sleep (). néhány művelet blokkolási sorban. egyes műveletek csatornákon és másokon.
A központban az InterruptedException azt jelzi, hogy a szál a művelet befejezését kéri. Ebben az esetben Ön nem kéri, hogy azonnal befejezze munkáját. Meg kell kérni, hogy helyesen lépjen ki. Ez eltarthat egy ideig.
A szálat a Thread.interrupt () módszerrel megszakítják. A JVM két módon tudja értesíteni a szálat, hogy megszakad. Az első valójában egy MegszakítottException. A második az INTERRUPT stream jelző. amely a Thread.isInterrupted () módszerrel érhető el. A második megszakítási jelátviteli módszer figyelmen kívül hagyása tipikus hiba.
Ez a kód helytelen, mert "megnyomja" a megszakítási jelet. Ha ezt a kódot a szálösszetételben hajtja végre, akkor erre a feladatra a munkát (akit hívtak) a feladatok végrehajtásának befejeztével kellett végrehajtania, mert a szál megszakítást kapott. De ez nem fog megtörténni, mert a megszakítási jelet a fenti kód megfogta. Ez általában azt fejezi ki, hogy miután elküldte a gyilkos jelet a java gépnek, még mindig van dolgozó szál, ezért a JVM nem tudja befejezni munkáját. Ebben az esetben az egyetlen kimenet a kill -9.
A következő kód is helytelen, mert a megszakítást "maszkoljuk" egy másik típusú kivételes helyzetbe. Így nem teszi lehetővé a hívó fél számára, hogy rögzítse a megszakítási helyzetet.
A helyes kód így fog kinézni.
Itt megfogjuk az InterruptedException-ot, és megjelentjük a megszakítás jelzését jelző zászlót.
A megszakítási politika része a szerződésnek. Ha kijelenti, hogy az InterruptedException nem fordulhat elő a módszer végrehajtása közben, de Ön maga is felhívja azokat a módszereket, amelyek ezt a kivételt generálják, akkor az InterruptedException-ot helyesen kell átalakítani a megszakítás menetes zászlójához. Ugyanez vonatkozik a hívó félre is. Ha felhív egy olyan eljárást, amely szerződések alapján megszakítja az interakciót. akkor elvárhatja, hogy a módszer egy kivétellel megszakítson értesítést. Ha nem, akkor egy zászló segítségével.
Egy figyelmes olvasó megkérdezhetné a kérdést: "Miért kétféle jelzés? Nem lehet kezelni az egyiket? ".
Miért kell Thread.isInterrupted ()?
A megszakítottException kényelmetlen, mert ellenőrzött kivétel. Ez azt jelenti, hogy a fordító arra kényszeríti Önt, hogy vagy helyben dolgozza fel, vagy adja meg a szerződésben. Abban az esetben, ha a szerződésben nem adhatja meg a MegszakítottExcepciót (például olyan felületet implementál, ahol a MegszakítottException nincs megadva), akkor a stream-jelző marad az egyetlen módja annak, hogy megmondja a hívó félnek a megszakítási információkat.
Miért van szükségem egy MegszakítottExceptionre?
Az InterruptedException lehetővé teszi, hogy megszakítsa a folyamatot, amely már blokkoló hívást hajt végre. Ha a módszer már fut, akkor csak egyetlen módon lehet megszakítani, anélkül, hogy értéket adna vissza, és megsértené szerződését - kivételt generálhat. Ebben az esetben a módszer visszatérési értéke egyszerűen nem definiált.