LÄR DIG JAVA

Threads - Skapa ditt eget spel

En tråd är ett exekveringsflöde i ett program. Flera trådar kan göra framsteg under samma tidsperiod. På flera processorkärnor kan de också köras parallellt, men startordning och exakt körordning är inte garanterade.

Thread och Runnable

En klass kan ärva Thread och skriva över run. Anropa start för att starta en ny tråd. Ett direkt anrop till run är ett vanligt metodanrop på den anropande tråden. Samma Thread-objekt kan bara startas en gång.

public class Worker extends Thread {
    @Override public void run() {
        System.out.println("Arbete på " + Thread.currentThread().getName());
    }
    public static void main(String[] args) throws InterruptedException {
        Worker worker = new Worker();
        worker.start();
        worker.join(); // Vänta tills arbetstråden har avslutats.
    }
}

Ett annat sätt är att låta en Runnable beskriva uppgiften och lämna den till en Thread. Det skiljer arbetet från själva tråden.

public class TaskDemo {
    public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> System.out.println("Arbete i bakgrunden");
        Thread worker = new Thread(task);
        worker.start();
        worker.join();
    }
}

Tillstånd och avbrott

Thread.State har sex värden: NEW (inte startad), RUNNABLE (körbar eller körande i JVM), BLOCKED (väntar på ett monitorlås), WAITING (väntar utan tidsgräns), TIMED_WAITING (väntar med tidsgräns) och TERMINATED (avslutad). De är JVM-tillstånd och beskriver inte exakt operativsystemets schemaläggning.

Thread.sleep pausar den anropande tråden utan att släppa dess monitorlås. Object.wait används tillsammans med synkronisering och släpper låset på objektet under väntan. Villkoret ska kontrolleras i en loop eftersom tråden kan väckas utan att villkoret har uppfyllts.

interrupt är en begäran om avbrott, ingen garanti för att tråden stoppas. Arbetet behöver reagera på avbrottsflaggan eller InterruptedException. Delat muterbart tillstånd kräver samordning för att undvika datakapplöpningar.

Trådar i vårt spel

Spelets Swing Timer kör sina händelsehanterare på EDT, samma tråd som hanterar tangentbord och målning. Vi behöver därför ingen egen speltråd. Blockera inte EDT med sleep, join, filhämtningar eller långa beräkningar.

Läs mer i Oracles guide till EDT och dokumentationen för Thread.State.

Vanliga frågor om Threads - Skapa ditt eget spel

Vad handlar Threads - Skapa ditt eget spel om?

Lär dig grunderna i Javas trådar: Thread, Runnable, start, run och trådtillstånd. Så fungerar Swings händelsetråd i spelet.

Hur övar jag på Threads - Skapa ditt eget spel?

Kör exemplen själv, ändra ett värde i taget och jämför sedan resultatet med förklaringen på sidan.