Parallellism, återblick Josef Svenningsson December 11, 2012
Lab7 Det är problem med lab7. Gå med i den grupp som ni använt tidigare. DEMO
Flera saker händer samtidigt Ofta hanterar program olika indata från omvärden. Men dessa indata kan komma väldigt nära i tiden eller till och mer hända samtidigt. Exempel: bilar, webservrar Hur kan man skriva ett program som hanterar flera saker samtidigt?
Parallellism Vi har hittills programmerat sekvensiellt, bara en sak händer åt gången i ett program. Både datorer och mobiltelefoner har idag flera processorer. Hur skriver man sitt program så att det kan utnyttja beräkningskraften hos flera beräkningsenheter?
Trådar I Java använder man trådar för att modellera parallellism. Trådar modelleras med klassen Thread. När man startar en tråd kommer den att köras för sig själv. Några konstruktorer och metoder från klassen: Thread(Runnable r); void start(); void join(); Metoder join väntar till tråden har exekverat färdigt.
Runnable interface Interfacet Runnable används för ett objekt som public interface Runnable { public void run(); Metod run är den som kommer att köras i en separat tråd.
Timer Klassen Timer använder sig av trådar för att ligga och vänta och sedan skapa händelser parallellt med att det övriga programmet körs.
Vad skriver programet ut? public class Race implements Runnable { private int counter = 0; public void run() { for(int i = 0; i < 1000000; i++) { counter++; public static void main(string[] args) throws InterruptedException { Race r = new Race(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("Counter = " + r.counter);
Delade resurser När trådar har delade resurser måste man vara nogrann så att de inte ändrar på resurserna samtidigt. Annars kan konstiga saker hända. När en tråd modifierar en delad resurs kallas det för en kritisk sektion (eng. critical section). Ett sätt att lösa problemet med kritiska sektioner är att se till att man får ömsesidig uteslutning (eng. mutual exclusion).
Lås För att uppnå ömsesidig uteslutning kan man använda lås. I paketet java.util.concurrent.locks finns det interface och klasser för att uppnå ömsesidig uteslutning. public interface Lock { public void lock(); public void unlock();... Alla trådar som använder en delad resurs behöver också ha tillgång till ett lås för denna resurs. Innan de vill komma åt resursen behöver de anropa lock Efteråt behöver de anropa unlock
Nu skriver programmet ut rätt sak import java.util.concurrent.locks.*; public class RaceFixed implements Runnable { private int counter = 0; private Lock lock = new ReentrantLock(); public void run() { for(int i = 0; i < 1000000; i++) { lock.lock(); counter++; lock.unlock(); public static void main(string[] args) throws InterruptedException { RaceFixed r = new RaceFixed(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("Counter = " + r.counter);
Svårigheter med att skriva parallella program Det finns många svårigheter med att skriva parallella program. Race condition, Deadlock, två eller fler trådar blockerar varandra så att inget händer. Starvation, en tråd får aldrig åtkomst till den gemensamma resursen och kan inte uträtta sitt arbete. Om man har realtidskrav och prioriteter bland trådar finns det ännu fler problem som kan uppstå. Unvik att skriva parallella program i möjligaste mån. Om ni måste, använd biblioteksfunktioner i så stor utsträckning som möjligt!
Sammanfattning Sammanfattning av kursinnehållet
Primitiva datatyper double, int etc. Man kan utföra aritmetik på värden av dessa typer. Omslagsklasser, Double, Integer etc. Innehåller hjälpfunktioner för max- och minvärden och parsning.
Scanner Klassen Scanner kan användas för att tolka en sträng eller en fil. int nextint(); double nextdouble(); boolean nextboolean(); String next(); boolean hasnextint(); boolean hasnextdouble(); boolean hasnextboolean(); boolean hasnext();
if-satsen Används om man vill göra olika saker beroende på något villkor if (villkor1) {...... if (villkor2) {... else {..
while-satsen Används för att göra saker upprepade gånger. Bra när man inte vet i förväg hur många gånger man vill upprepa while (sc.hasnext()) { System.out.println(sc.next());
for-satsen Används också för att göra saker upprepade gånger Bör användas när man i förväg vet hur många iterationer man vill köra den. int[] nr = {0,1,2,3,4,5 for(int i=0;i<6;i++) { System.out.println("Tal : " + nr[i])
do-while-satsen Som while-satsen men man vill iterera minst en gång do {... while (villkor)
Klasser metoder och parameteröverföring primitiva typer kopieras objekt överförs via referens objekt är instanser av klasser instansvariabler, instansmetoder klassvariabler, klassmetoder null this Scanner sc1; Scanner sc2 = new Scanner("Hej");
Interface Ett sätt att garantera att en klass har vissa metoder Subtypning - metoder som har parametrar där typen är ett interface kan acceptera alla klasser som implementerar detta interface. interface ActionListener { public void actionperformed(actionevent e)
Endimensionella Fält En ordnad samling. int[] digits = {1,2,3,4,5,6; Point[] points = new Point[100]; Ofta används for-loopar för att hantera fält int sum = 0; for(int d : digits) { sum += d;
Flerdimensionella fält int[][][] picture = new int[320][480][3] Resulterar i nästlade for-loopar for(int i=0;i < picture.length;i++) { for(int j=0;j < picture[i].length;j++) { int temp = picture[i][j][0]; picture[i][j][0] = picture[i][j][2]; picture[i][j][2] = temp;
Enumereringstyper Skapar en uppräkning av saker public enum suit { HEARTS, SPADES, DIAMONDS, CLUBS;
switch-satsen Användbar för att välja mellan fler alternativ Fungerar speciellt bra med enumereringstyper Glöm inte break! switch(card) { case HEARTS: System.out.println("Hearts"); case SPADES: break; System.out.println("Spades"); break; case DIAMONDS: System.out.println("Diamonds"); break; case CLUBS: System.out.println("Clubs"); break; default-fallet används för att täcka alla fall man inte räknat upp.
Exceptions - undantag throw kastar ett exception try - catch fångar ett exception throw new IllegalArgumentException(); try {... catch (IllegalArgumentException e) {... Checked exceptions behöver deklareras om de inte fångas Unchecked exceptions behöver inte deklareras public void readfile(string file) throws FileNotFoundException;
Argument till ett program Sträng-fältet i main kan användas för att ge parametrar till ett program public static void main(string[] args) {...
GUI Model-View-Controller Grafiska komponenter Layout - för att lägga ut grafiska komponenter på skärmen Lyssnare - för att hantera händelser
Lokala klasser Klasser kan deklareras inuti klasser Anonyma lokala klasser kan deklareras Användbart när man programmerar med lyssnare button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.out.println("I was clicked."); );
Graphics-klasser, rita egna bilder För att kontrollera hur en komponent ska ritas ut överskugga man paintcomponent. Klassen Graphics har många metoder för att rita bilder.
Timer Skapar händelser med jämna mellanrum Användbart för att skapa animationer
Colletions Standardklasser för att hantera samlingar av objekt. Interface: Set,List, Map etc. Klasser ArrayList, HashMap etc.
Rekursion Metoder som anropar sig själva Användbart t.ex. för att implementera rekursiva matematiska formler public static int fac(int n) { if (n==0) return 1; else return n * fac(n-1);
Tips för tentaplugg Det hjälper inte att bara sitta och läsa i boken. Programmera! Gör om övningarna och gör övningarna i boken.