[Java] Een methode onderbreken

Pagina: 1
Acties:

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 12-02 22:19
Ik zit met een probleem waarbij een programma soms lang moet wachten op antwoorden van een ander programma. Ik wilde dit oplossen door een bepaalde methode te onderbreken als een ingesteld tijdslimiet is overschreden.

Het probleem is dat deze methode geen (while)loop bevat waarin ik een flag op false kan zetten, en ik ook niet de hele thread wil stoppen.

Wat ik dus in feite wil weten: Is het mogelijk in Java een method te interrupten?

edit:
Heb gezocht op GoT, maar daar staan alleen topics om threads te stoppen. Geprobeerd om het met TimerTask&Exceptions op te lossen, maar geen succes

[ Voor 15% gewijzigd door BestTested! op 09-10-2006 18:48 ]


  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 13:06
Weet het zo niet direct, als methode in aparte thread draait kun je sleep gebruiken. Deze kunnen verdergaan als een event gebeurt, geloof ik.zoek ff in de api.

[ Voor 30% gewijzigd door asfaloth_arwen op 09-10-2006 18:49 ]

Specs


  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 17-11-2025
Kan je niet aan het begin van je methode de tijd opvragen en dan in verderop in die methode nog een keer en kijken of dat niet over de tijd heen komt en zo ja dan doe je een return;

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoe wordt er dan precies gewacht op die data? Je kan een thread interrupten met Thread.interrupt() (jawel ;)), maar alleen als hij wacht op synchronisatie of in een blocking IO operatie zit. Als je gewoon code aan het uitvoeren bent zit er eigenlijk niets op dan af en toe te checken of de timeout verstreken is.

En die interrupt moet je natuurlijk doen vanuit een andere thread (hoofdthread) die gewoon wacht op de timeout.

[ Voor 17% gewijzigd door .oisyn op 09-10-2006 18:52 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Er zit toch echt weinig anders op dan een proces op een aparte thread te starten en je hoofdthread daarop te laten wachten. En dan uiteraard wel zorgen dat je de andere thread abort als het te lang duurt.

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 12-02 22:19
Probleem is dat ik weinig aan de code kan veranderen, het wordt gedraaid in een Multi-Agent Enviroment. De functie die ik dus wil stoppen is iets van:

Java:
1
2
3
4
public function doAction()
{
   makeDeal(parameter1, parameter2);
}


Maar deze makeDeal methode (die ik niet zelf heb geschreven) kan te lang duren, daarom zou ik deze soms willen afbreken (of de doAction method).

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Op het eerste gezicht ontkom je er niet aan de makeDeal in een aparte thread te stoppen. Dan ben je veilig. Vooral het feit dat je er niets aan kunt veranderen maakt de andere opties lastig.

Fat Pizza's pizza, they are big and they are cheezy


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14:38
Volgens mij heb je hier niet echt diep over nagedacht. Ik denk dat de enige optie Thread.stop() is (en dan maar bidden dat de thread geen objecten in een ongedefinieerde toestand achterlaat). Als dit niet doet wat je wil, dan moet je maar eens goed nadenken over wat je wél wil, want een 'veilige' manier om code te onderbreken die daar niet op voorbereid is, bestaat eigenlijk niet.

Overigens stopt Thread.stop() niet direct de thread. Het heeft als effect dat de thread onderbroken wordt en dat er een ThreadDeath (of als je wil een andere exceptie naar keuze) opgeworpen wordt. Je kunt in je thread die exception dus catchen om te voorkomen dat de hele thread stopt, maar je hebt dan wel actieve aanroepen afgebroken.

Zoiets dus:
Java:
1
2
3
4
5
6
7
8
9
10
try {
   foo.someBlockingFunction();
} catch(ThreadDeath td) {
   // handle abort...
}

// other thread:
Thread.sleep(12345);
if(blockingThread.isAlive())
    blockingThread.stop();

[ Voor 42% gewijzigd door Soultaker op 09-10-2006 22:39 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:29

.oisyn

Moderator Devschuur®

Demotivational Speaker

Thread.stop() is al een geruime tijd deprecated

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14:38
Thread.stop() als concept was natuurlijk al van begin af aan deprecated (en terecht). Met de officiële deprecation is er ook niets vergelijkbaars voor in de plaats gekomen, dus als je zeker weet dat je zo'n ranzig hack wil toepassen moet je het gewoon met Thread.stop() doen. Maar liever dus helemaal niet.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

BestTested! schreef op maandag 09 oktober 2006 @ 19:00:
Maar deze makeDeal methode (die ik niet zelf heb geschreven) kan te lang duren,
Maar er komt wel gegarandeerd een keer antwoord? Want in dat geval kan je hem gewoon in een aparte thread gooien, een beperkte tijd wachten, en kijken of er antwoord gekomen is, alvorens verder te gaan en de taak verder te negeren. Aangezien de thread sowieso een keer dood gaat, blijf je niet met overblijvende threads zitten. Als het programma regelmatig herstart wordt is dat waarschijnlijk sowieso geen probleem. De taak afbreken kan, zoals hierboven al aangegeven, allerlei onverwachte gevolgen hebben.

Wie trösten wir uns, die Mörder aller Mörder?

Pagina: 1