"Szia Amigo!
– Valami apró, de érdekes dologról szeretnék mesélni.
"Figyelek. Szeretem a kicsi és érdekes dolgokat."
"Nos, tudod, hogy minden Thread objektumnak van egy run() metódusa. És hogy ezt külön szálon is végrehajthatod a start() metódussal."
"Természetesen."
"De most képzeld el ezt a helyzetet: elindítasz egy szálat, hogy végre hajtsanak végre valamilyen munkát, de kivételt dob, és a szál leáll, mert nem tudja, mit tegyen. Nem kellene valahogyan tudnod erről a hibáról?"
"Egyetértek. Valahogy el kell fognom a kivételt, ami a másik futó szálon történt. A Java még támogatja ezt?"
– Megsértesz. Persze, hogy így van.
"A Java készítői feltaláltak egy speciális interfészt UncaughtExceptionHandler néven. Így lehet elkapni és kezelni egy másik szálon előforduló kivételt, ha az a szál nem fogja meg:"
public class DownloadManager
{
public static void main(String[] args)
{
Thread thread = new DownloadThread();
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
}
});
thread.start();
}
"A Thread objektumnak van egy speciális setUncaughtExceptionHandler metódusa. Átadnia kell neki egy olyan objektumot, amely megvalósítja a Thread.UncaughtExceptionHandler felületet. Ennek az interfésznek csak egy metódusa van: uncaughtException(Thread t, Throwable e) . Ez a metódus lesz meghívva az átadott objektum, ha a futtatási metódusban nem elkapott kivétel fordul elő."
"A fenti példámban egyszerűen deklarálok egy névtelen belső osztályt (pirossal kiemelve), amely megvalósítja a Thread. Thread.UncaughtExceptionHandler felületet. És felülírom az uncaughtException(Thread t, Throwable e) metódust."
"Amint a metódus paraméterlistájából látható, két argumentum kerül átadásra: egy hivatkozás a Thread objektumra, ahol a kivétel előfordult, és maga a kivétel, amelyet Throwable e-ként adtunk át."
"Nos, miért van szükségem a t Thread változóra? Nem tudjuk már, hogy melyik szálba teszünk egy Thread.UncaughtExceptionHandler objektumot?"
"Ezt azért tették, hogy írhass egy univerzális kezelőt ezekre a helyzetekre. azaz létrehozhatsz egyetlen objektumot, és átadhatod több tucat különböző szálnak. Ezután az uncaughtException( Thread t, Throwable e) metódus mindig hivatkozást ad a Szálobjektum, ahol a kivétel történt."
"Sőt, több tucat szálat hozhat létre például egy ciklusban meghatározott feladatok végrehajtásához. Általában a Thread objektumra való hivatkozás nem lesz felesleges. Ezt megígérem."
"Hiszek neked. Soha nem tévedtél."
GO TO FULL VERSION