Avatar billede jespersahner Nybegynder
29. april 2006 - 16:14 Der er 2 kommentarer og
1 løsning

Afbryde thread-deadlock

Jeg afvikler en tråd, som nogle gange ender i en deadlock. I maven på tråden kalder jeg eksterne klasser, som jeg ikke selv har indflydelse på, og kald af disse resulterer somme tider i deadlocks.

Hvis jeg har mistanke om deadlock, ønsker jeg at afbryde (og måske genstarte) den kørende tråd.

Mit første spm. er: Vil Thread.join(tid) altid returnere efter 'tid' uanset deadlock inde i tråden?

Mit andet spm. er: Når en tråd returnerer efter 'tid', hvordan kan jeg så afgøre, om tråden returnerer pga. time-out eller før time-out? (jeg kan vel sætte et flag umiddelbart før tråden returnerer, som jeg så kan spørge på, men er det måden at gøre det på?)
Avatar billede webster Nybegynder
29. april 2006 - 19:52 #1
Jeg er ikke sikker på jeg helt forstår dit spg. For det første, hvilken form for deadlocks snakker vi så om? Hvis der er tale om et deadlock i den forstand at 2 eller flere tråde venter på at få fingrene i en resource som en anden tråd holder (såsom synkroniserings monitor) så kan du så vidt jeg ved ikke gøre noget for at terminere disse tråde.

1) Thread.join(tid) fra en ikke blokeret tråd vil altid returnere efter timeout tiden

2) du kan fx bruge et slags flag ja, eller skifte join ud med en af klasserne fra java.util.concurrent. Du kunne fx bruge en CountDownLatch med count sat til 1. Du kan på den foretage en await operation med en timeout og bagefter tjekket getCount for at se om den tråd du venter på nogensinde kom igennem.

Hvad du lige vil bruge denne venten til ved jeg dog ikke. Jeg tror som sagt ikke at du kan terminere en låst tråd (bemærk at Thread.stop og Thread.suspend begge er depecrated). Et bedre bud er nok at tage fat i problemet og få det løst. Jeg skal lige ud til noget mad der er i gang på komfureret, men finder lige nogle link til debug teknikker senere.
Avatar billede webster Nybegynder
29. april 2006 - 20:00 #2
Du kan faktisk bare starte udd med at bruge Jconsole til at få et thread dump fra alle kørende tråde. Det bør vise dig hvor locket opstår.
Avatar billede jespersahner Nybegynder
30. april 2006 - 11:46 #3
->webster: Tak for dit svar. Se evt. http://www.eksperten.dk/spm/706157 for en videre diskussion. Konkret bruger jeg nogle eksterne klasser, som jeg ikke har indflydelse på, og det er herfra mine problemer (deadlocks) opstår. Jeg vil dog kigge nærmere på JConsole, som jeg ikke kendte til. Det ser ret elegant ud; tak for tippet :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester