Jag har en tom loop som rullar så länge ett villkor är uppfyllt. Detta för att se till att tråden inte dör förrän det är OK. Att ha en tom loop innebär att programmet i princip hela tiden kollar om villkoret är sant och detta drar all tillgänglig CPU-kraft. För att lösa detta har jag lagt in en sleep på ett par sekunder i loopen.
Finns det ett bättre och snyggare sätt att lösa det på, där man samtidigt har direkt synkronisering? Med min lösning så kan programmet i värsta fall vänta dessa sekunder i onödan om villkoret förändras precis efter kontroll.
public class Test implements Runnable
{
boolean done = false;
public void run()
{
try
{
while(!done)
{
// gör vad du ska
Thread.sleep(200);
}
}
catch(InterruptedException ie)
{
}
}
}
Om du vill stoppa körningen av tråden direkt, utan att tråden sover ( i detta fall, 200 ms) så kan du anropa Thread-klassens interrupt().
Java har en massa fräcka blockingfunktioner fr.o.m. version (1.)5. Blocking queues skulle kunna användas i ditt fall...
class C {
private BlockingQueue<Object> lock = new ArrayBlockingQueue<Object>(1);
public void run(){
System.out.print("Börjar tråden...");
lock.take();
System.out.println(" avslutar.");
}
public void stopRunning(){ lock.add(new Object()); }
}
När run() börjar är kön tom, så take() väntar tills något hamnar i kön, vilket händer vid anrop av stopRunning(). Detta innebär förstås att tråden själv inte kan avgöra exakt när väntandet ska avbrytas, vill du decoupla det från vad det nu är som bevakas får du göra någon lyssnarvariant.