Hem E-böcker Specialeffekter och spelutveckling i Java Exceptions, statiska klasser

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 >>