_ 1.1 Multitrådning Uppgiften går ut på att konstruera ett enkelt multitrådat program. Det finns två sätt att göra en klass trådad på och vi övar här på båda. Det är mycket viktigt att man förstår båda dessa sätt bra eftersom några av de efterföljande uppgifterna är trådade. Trådning är en mycket vanlig och kraftfull teknik. __ Uppgift Gör ett program som består av tre klasser: - En huvudklass med en §main§-metod - En trådad klass §T1§ som ärver av klassen §Thread§ - En trådad klass §T2§ som implementerar interfacet §Runnable§ När huvudklassen körs ska den: = Skapa och starta en tråd från klass §T1§ = Vänta i 5 sekunder = Skapa och starta en tråd från klass §T2§ = Vänta i 5 sekunder = Stoppa tråden från klass §T1§ = Vänta i 5 sekunder = Stoppa tråden från klass §T2§ Trådarna ska en gång per sekund skriva ut följande på §STDOUT§ (kommandofönstret): - Tråd §T1§: §Tråd 1§ - Tråd §T2§: §Tråd 2§ Frivillig utökning är att även titta på hur man pausar trådar och då utöka programmet ovan så huvudklassen gör följande: = Skapa och starta en tråd från klass §T1§ = Vänta i 5 sekunder = Skapa och starta en tråd från klass §T2§ = Vänta i 5 sekunder = Pausa tråden från klass §T2§ = Vänta i 5 sekunder = Aktivera tråden från klass §T2§ = Vänta i 5 sekunder = Stoppa tråden från klass §T1§ = Vänta i 5 sekunder = Stoppa tråden från klass §T2§ En annan frivillig utökning är att göra ett program som använder trådar och grafik. __ Exempel Ett enkelt exempel kan köras enligt följande: = Hämta filen: §[ThreadTester.jar, 05_ass/ip1/1/1.1/ThreadTester.jar]§ = Kör programmet med: §java -jar ThreadTester.jar§ Ett enkelt exempel på ett utökat program med pausning kan köras enligt följande: = Hämta filen: §[ThreadTester2.jar, 05_ass/ip1/1/1.1/ThreadTester2.jar]§ = Kör programmet med: §java -jar ThreadTester2.jar§ Ett enkelt exempel på ett utökat program med grafik som visar ett snöfall där varje snöflinga är en egen tråd kan köras enligt följande: = Hämta filen: §[SnowStorm.jar, 05_ass/ip1/1/1.1/snow/SnowStorm.jar]§ = Kör programmet med: §java -jar SnowStorm.jar§ Ett enkelt exempel på ett utökat program med grafik med pausning som visar en mängd bollar där varje boll är en egen tråd kan köras enligt följande: = Hämta filen: §[Space.jar, 05_ass/ip1/1/1.1/space/1/Space.jar]§ = Kör programmet med: §java -jar Space.jar§ Här kan man lägga till bollar genom att trycka på §+§ och pausa/aktivera genom att trycka på §p§. __ Tips Man kan först bekanta sig med trådning genom att göra ett minimalistiskt trådat program (som inte direkt har med uppgiften att göra), exempelvis följande där man ärver från klassen §Thread§: § public class X { public static void main (String[] args) { new Y(); while(true) System.out.println("In main"); } } class Y extends Thread { public Y() { start(); } public void run() { while(true) System.out.println("In run"); } } § Sen kan man göra samma sak fast med en klass där man implementerar §Runnable§: § public class X { public static void main (String[] args) { new Y(); while(true) System.out.println("In main"); } } class Y implements Runnable { Thread t = new Thread(this); public Y() { t.start(); } public void run() { while(true) System.out.println("In run"); } } § Vid implementering av gränssnittet §Runnable§ så måste man alltså deklarera och initiera en variabel för tråden: § Thread t = new Thread(this); § Man startar sen tråden på ett lämpligt ställe med: § t.start(); § När man har tittat på dessa två små program så kan man gå vidare och rikta in sig på att lösa uppgiften. För att pausa ett program en viss tid, exempelvis 5 sekunder, så kan man göra enligt följande: § try { Thread.sleep(5000); } catch(InterruptedException ie) { // ... osv ... } § Läs i API-beskrivningen under §java.lang.Thread§ om varför §stop§-metoden med flera inte fungerar, där finns det även bra tips på hur man utifrån stoppar en tråd. I stort sett så har man en boolsk variabel (här §alive§) som är deklarerad som en instans-variabel (som man når utifrån via metoder eller fulare direkt om den är deklarerad §public§) och en enkel §while§-loop som fortsätter så länge den boolska variabeln är §true§: § public void run() { while(alive) { System.out.println("Thread 1"); try { t.sleep(1000); } catch(InterruptedException ie) {} } } § Ändras den boolska variabeln §alive§ till §false§ så avslutas körningen i §run§-metoden och tråden slutar köras (och kan inte startas om). För att implementera en utifrån styrd pausning så kan man lägga till en boolsk variabel (här §active§) och en extra inre §while§-loop runt det som ska köras: § public void run() { while(alive) { while(active) { System.out.println("Thread 1"); try { sleep(1000); } catch(InterruptedException ie) {} } try { sleep(25); } catch(InterruptedException ie) {} } } § Ändras den boolska variabeln §active§ till §false§ så pausas körningen och ändras den till §true§ så fortsätter körningen i §while§-loopen. Det senare §sleep§-anropet (efter den inre §while§-loopen) behövs för att den yttre §while§-loopen inte ska ta all processorkraft när den inre pausar. De som vill testa multitrådning med grafik kan börja med att titta på källkoden §[SnowStorm.java, 05_ass/ip1/1/1.1/snow/SnowStorm.java]§ till snöstormsexemplet ovan. __ Hjälp ~ 05_ass/help/01.txt > [Klicka här för hjälp, helper.dsv@gmail.com, Prog Internet: 1.1 Multitrådning: http://people.dsv.su.se/~pierre/i/i.cgi?href=05_ass/ip1/1.1.txt] ½===system_tutoring_message===½ < ~ 05_ass/help/02.txt