Programmet vil altså vente på, at alle threads afsluttes. Hvis imidlertid blot en af disse threads opdager en fejl og returnerer til programmet, skal alle øvrige threads afbrydes og afsluttes.
->arne_v: Jo, det er nok en udbygning af tidligere spm.
Min grundlæggende udfordring er at genstarte min applikation, når der indtræffer fejl, som ikke håndteres. Sådanne fejl optræder i mit tilfælde fra eksterne klasser, som jeg bruger og derfor ikke har indflydelse på. At fange fejl løses af imidlertid af Thread.setDefaultUncaughtExceptionHandler, som virker "globalt" i forhold til alle fejl, der måtte indtræffe.
Det næste problem er så at få ryddet op. Jeg forsøger da som i dit eksempel at interrupt'e alle tråde, jeg har startet op, herunder dispose'e alle JFrames, og i øvrigt sætte alle tråd-referencer til 'null' inden genstart (nok lidt ligegyldigt, da referencerne jo etableres på ny ved genstart).
Imidlertid "fryser" applikationen efter genstart, og jeg gætter på, at det skyldes, at jeg ikke får ryddet alt op - altså noget med at visse bagved kørende tråde (sat i gang af mine eksterne klasser) ikke bliver afsluttet og derfor holder på ressourcer, som den genstartede applikation skal bruge.
Selv i dit eksempel med interrupt, dispose og release kan man vel ikke være sikker på, at alle bagved kørende tråde afsluttes (altså hvis T1 eller T2 starter andre tråde osv.) eller..?
Hvis jeg forstår dette ret, savner jeg en slags funktionalitet (måske findes den uden mit kendskab), hvor man ved interrupt af en tråd også interrupte'r alle tråde, som denne måtte have sat i gang, så man altså er 100% sikker på at få ryddet alt op, herunder eventuelle deadlocks.
Men måske er dette nonsens (?) En tråd kan vel meget vel starte en anden tråd op uden at holde en reference til denne tråd (altså bare med new Thread()), og hvis denne anden tråd ender i en deadlock, har man balladen.
En måde at løse genstarts-problemet på, hvor man i stedet for den beskrevne "varme" genstart laver en "kold" genstart, kunne være at starte applikationen i en anden JVM. Herved kan man ved fejl skyde applikationen ned med System.exit(0) og derefter starte forfra. Det er dog ikke videre elegant og burde nok ikke være nødvendigt.
ThreadGroup tg = Thread.currentThread().getThreadGroup(); int nt = tg.activeCount(); Thread[] t = new Thread[nt]; tg.enumerate(t); for(int i = 0; i < nt; i++) { if(t[i] != Thread.currentThread()) { t[i].interrupt(); } }
Hej, som jeg var lidt inde på i din anden tråd så findes der ikke nogen 100% sikker måde at lukke tråde ned og få frigivet resourcer som denne/disse tråde holder. Hvis tråden først er deadlocked på en monitor så kan du hellere ikke interupte den (afaik). Det her problem er en af bevæggrundende for sun's barcelona/joe projekt der søger at implementere en mvm (multi-virtual machine eller noget i den dur) hvor dele af applicationen kan anbringes i en isolate og kontrolleres som var det et selvstændigt program. Det er desværre bare ikke færdigt endnu (de har teknisk set en beta ude at deres mvm men ved ikke noget om hvor klar den er til et produktions miljø).
Her er noget http://sourceforge.net/projects/echidna/, men den officielle hjemmeside findes vist ikke. Jeg ved ikke, om det stadig supporteres, eller der er kommet noget andet siden (?)
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.