28. april 2006 - 00:02Der er
6 kommentarer og 1 løsning
"Global" catch af Exception i Thread
Jeg har et måske lidt diffust spm.: Er der en måde, hvorpå man "globalt" kan catch'e en Exception i en Thread - altså catch af en Exception i en anden tråd.
Konkret er mit problem, at jeg bruger nogle eksterne klasser, som kører i egne Threads, og disse klasser kaster Exceptions, som jeg gerne vil kunne håndtere i min main-Thread.
->mikkelbm: Det er en ganske fornuftig og simpel løsning.
Jeg har dog flg. problem: Jeg har en applikation, som indeholder flere Threads, herunder JFrames. Hvis applikationen fejler med en Exception, som jeg ikke catch'er, er mit ønske at genstarte applikationen. Med andre ord ønsker jeg at afslutte alle kørende Threads (herunder specielt JFrames) pånær main-Thread. System.exit(0) kan ikke bruges, som jeg ser det, idet den også afslutter main-Thread.
Er der en simpel måde at genstarte en applikation på, hvis en UncaughtException indtræffer?
public class ExceptionRestart { public static GUI f; public static Semaphore sf = new Semaphore(1); public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler(new Handler()); while(true) { try { sf.acquire(); } catch (InterruptedException e) { } T t = new T(); f = new GUI(); t.start(); f.setVisible(true); } } }
class GUI extends JFrame { public GUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Some GUI"); setSize(300, 300); } }
class T extends Thread { public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { } throw new RuntimeException("Oops"); } }
class Handler implements UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) { System.out.println("Restarting ..."); ExceptionRestart.f.dispose(); ExceptionRestart.sf.release(); } }
public class RestartableApp { private T t; private GUI f; private Semaphore sf = new Semaphore(1); public void initRestart() { f.dispose(); sf.release(); } public void exec() { Thread.setDefaultUncaughtExceptionHandler(new Handler(this)); while(true) { try { sf.acquire(); } catch (InterruptedException e) { } t = new T(); f = new GUI(); t.start(); f.setVisible(true); } } public static void main(String[] args) { RestartableApp er = new RestartableApp(); er.exec(); } }
class GUI extends JFrame { public GUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("Some GUI"); setSize(300, 300); } }
class T extends Thread { public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { } throw new RuntimeException("Oops"); } }
class Handler implements UncaughtExceptionHandler { private RestartableApp app; public Handler(RestartableApp app) { this.app = app; } public void uncaughtException(Thread t, Throwable e) { app.initRestart(); System.out.println("Restarting ..."); } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.