Specialeffekter och spelutveckling
i Java(TM) - Exceptions, statiska klasser och hur man söver
en tråd
av Anibal Wainstein
3.0.3 Exceptions, statiska
klasser och hur man söver en tråd
Appleten i det förra avsnittet var väldigt processorkrävande
som du kanske märkte. Det kanske inte är nödvändigt
att skriva ut "Tjena Sverige!" varje mikrosekund, det räcker
nog med en gång per sekund eller mindre.
Vi måste nu ha en fördröjning i run() metodens
slinga. Med kommandot sleep() i klassen Thread kan vi få
tråden att "sova" ett visst antal millisekunder (tusendelar).
Den här funktionen är en så kallad statisk
funktion. En funktion av den här typen kan anropas
utan att behöva instansiera klassen (utan att behöva
göra ett objekt av det). Så du kan skriva:
Thread.sleep(1000);
Nu kommer tråden att sova i exakt 1000 millisekunder
(som är precis en sekund). Statiska klasser kan vara
nyttiga ibland om du råkar ha en mycket nyttig funktion
i en klass som du använder ofta. Då kan det vara
bra att göra funktionen statiskt och att kunna spara
lite minne genom att slippa allokera minne för ett nytt
objekt. Minnet som krävs för en statisk metod allokeras
när Java motorn först stöter på klassen
som den statiska metoden finns på. Alla framtida objekt
som skapas ur klassen kommer att använda samma minnesplats
där den statiska metoden finns. Det finns något
som man måste ha i åtanke dock. Statiska funktioner
kan inte behandla icke statiska variabler i samma klass. Detta
gäller dock inte om dessa variabler också
är statiska. Varför då, frågar du? Jo,
för att när man inte har allokerat minne för
dessa variabler (skapat ett nytt objekt) så existerar
de inte helt enkelt! Effekten av statiska variabler
är att om du har flera likadana objekt så kommer
alla att dela på samma variabel. D.v.s. att om en statisk
variabel ändras i ett objekt så ändras den
i alla objekt.
Nu tror du säkert att du nu fritt kan använda denna
funktion och lägga in den i din slinga. Nej tyvärr,
vi är inte riktigt framme än. Problemet med sleep()
funktionen är att det kastar en exception som
du måste fånga. Exceptions används inom Java
av funktioner för att berätta för klassen som
anropade att någonting gick fel. I det här fallet
så kan en annan tråd avbryta hela processen.
Du måste veta vad som har hänt och därför
kastar funktionen en exception. Detta är mer till besvär
än till nytta, för om du inte fångar den så
stoppas appleten (eller kompilatorn vägrar kompilera
det). Först sätter du funktionen i en try-slinga
och sedan fångar du dess exception i en catch-slinga:
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
System.out.println("Något avbröt sleep() metoden")
}
Catch-slingan kräver en argument som måste vara
en exception klass. Avbrytningsklassen heter InterruptedException
och det är den som kastas ut av sleep(). Det finns många
typer av exceptions, där alla är subklasser till
exception klassen. Andra typer av kända exceptions är
NullPointerException (du har försökt använda
en tom pekare), ArrayIndexOutOfBoundsException (du har specifierat
ett för stort eller för liten index när du
har använt en array) och IOException (det har uppstått
ett fel t.ex. vid inläsning av en fil).
För att göra vår "effekt" mer intressant,
så gör vi om run() metoden i förra avsnittet:
public void run()
{
while (true)
{
showStatus("Länge");
try {Thread.sleep(1000);}
catch(InterruptedException e) {}
showStatus("Leve");
try {Thread.sleep(1000);}
catch(InterruptedException e) {}
showStatus("Java!");
try {Thread.sleep(1000);}
catch(InterruptedException e) {}
}
}
Jag har för att göra koden mer lättläst,
skrivit pauskoden på två rader och tagit bort println()
meddelandet eftersom det är inte intressant att veta om
någon annan tråd avbryter den. Kan du gissa vad
som kommer att hända nu? Först skrivs "Länge"
ut, tråden väntar 1 sekund och "Leve" skrivs ut,
efter ännu en sekund så skrivs "Java!" ut och efter
1 sekund till så börjar programmet om från
början igen. Klicka
här så får du se.
Nu kan du säkert också märka att din dator
inte "flåsar" så mycket.
Nästa sida >>
|