Specialeffekter och spelutveckling
i Java(TM) - Principerna bakom programtrådar
av Anibal Wainstein
3.0 Principerna bakom programtrådar
I och med releasen av Windows 95 så introducerades
multipla programtrådar till PC programmeringen. Operativsystem
som t.ex. UNIX har länge haft detta. En tråd fungerar
som en "liten arbetare" som sitter och arbetar med programkoden.
Har du flera program igång i systemet så finns
minst en tråd för varje program. Vissa program
kan ha flera trådar som t.ex. en web tittare som stöjder
Java. För att kunna ha animerade Java applets så
är vi tvungna att använda oss av två trådar.
Först finns program- eller huvudtråden som brukar
ibland vara Java motorns egen tråd. Denna används
för den så kallade händelsesystemet som tar
hand om användarinput som t.ex. musrörelser och
tangenbordshändelser. I förra avsnittet så
har vi enbart arbetat med huvudtråden. Problemet med
animationer är att de ofta kräver att man har en
tråd som hela tiden sitter och jobbar med animationskoden.
Huvudtråden kan vi inte använda för då
skulle appletens andra funktioner att sluta fungera, appleten
hänger sig. Ett program som hänger sig brukar
oftast bero på att en huvudtråd fastnar i en programslinga
och kommer inte loss eller att den krockar med en annan tråd
och stannar. Anta att två web designers sitter och arbetar
med en hemsida. Om de inte bestämmer vem som ska göra
vad så kommer det troligen att sluta med att de skriver
över varandras ändringar. Detta leder till att båda
blir arga, samarbetet spricker och därmed också
projektet. På samma sätt måste man vara försiktig
när man använder trådar.
3.0.1 En applets start() och
stop() metoder (Runnable gränssnittet)
Applets har ingen naturlig stöd för trådar.
Man sätter stöd genom att lägga till Runnable
gränsnittet (interface):
import java.applet.*;
import java.awt.*;
public class tradtest extends Applet implements Runnable {
}
I vår hittils tomma trådtest applet så
har vi lagt till "implements Runnable" gränsnitt. Med
deklarationen "implements" kan man lägga till en rad
extra funktioner åt en klass. Den används för
att utöka klassen. "Runnable" kommer att ge tillgång
till tre extra metoder: start(), stop() och run().
I en applet som stödjer trådar brukar init() och
paint() metoderna utföras av Java motorns huvudtråd
först, den tredje metoden som anropas är start()
metoden.
I start() metoden kan du initiera och starta din animationstråd.
public Thread programtrad = null;
public void start()
{
if (programtrad == null)
{
programtrad = new Thread(this,"programtrad");
programtrad.start();
}
}
Variabeln "programtrad" är global inom appleten och du
måste deklarera den själv. Vad startmetoden gör
först är att den undersöker att inte tråden
redan existerar och är igång (ibland kan vissa web
tittare köra start() metoden flera gånger).
Nästa steg är att skapa själva tråden.
Den kräver en pekare till din applet (this) och ett namn
som kan vara vad som helst (vi kallar den för "programtrad"
för enkelhetens skull).
Till sist så startar man tråden med dess egen
start() metod. När hemsidebesökare byter
sida eller stänger av sin browser så anropas genast
stop() metoden med huvudtråden:
public void stop()
{
if ((programtrad != null) && programtrad.isAlive())
programtrad.stop();
programtrad = null;
}
För säkehets skull så undersöker man att
programtråden är skapad och att den är igång
med metoden isAlive(). Är den detta så stoppas tråden
med dess egen stop() metod och vi sätter "programtrad"
till null. Dessa två metoder kommer du troligen
alltid att bara klippa ut och klistra in i dina program i
framtiden. Dessa är generella metoder som alla specialeffekts-
eller spelapplets har.
Nästa sida >>
|