Ladda ner presentationen
Presentation laddar. Vänta.
1
JVM Java Virtual Machine
En simulerad dator som förstår Javabytekod Finns utvecklad för alla platt-formar som Java fungerar på Javabytekod (kompilerad Javakod) är generell… Javaprogram interpreteras, C++-program exekveras… Ger något långsammare program…
2
Traditionell kompilering och exekvering
Källkod skapas med texteditor Kompilator översätter källkoden till en objektfil Länkaren sätter ihop flera objektfiler till en exekverbar fil Operativsystemet placerar den exekverbara filen i primär-minnet och programmet exekveras
3
Kompilering och exe-kvering av Javaprogram
Källkod skapas med texteditor Kompilatorn översätter källkoden till Javabytekod Den plattformsberoende interpretatorn (JVM) exekverar programmet genom att läsa Javabytekoden och se till att instruktionerna utförs
4
För varje program som exekveras startas en ny JVM
Internetprogrammering där flera datorer samarbetar kan därigenom utvecklas och simuleras på en dator
5
Enkel I/O All in- och ut-kommunikation i Java hanteras som strömmar
Tangentbord, skärm Filhantering Kommunikation över Internet Ett stort antal strömmar finns: Byte-strömmar in/ut: har ordet stream i sitt namn Char-strömmar in/ut: har orden Reader/Writer i sitt namn
6
Exempel på inmatning från tangentbord och utmatning till skärm
import java.io.*; public class InputOutput { public static void main(String[] args) { String input = null; // Inmatning från tangentbord InputStreamReader in = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(in); try { System.out.print("Mata in sträng: "); input = br.readLine(); } catch (IOException e) {;} // Utmatning till skärm System.out.println("Du matade in: " + input); ****************************************** Mata in sträng: Peter Carlsson Du matade in: Peter Carlsson
7
Filhantering Filhantering kan utföras på ett plattformsoberoende sätt
File file = new File(”Text.txt”); long l = file.length(); boolean b = file.isDirectory(); boolean fd = file.delete(); Osv. Fler möjligheter: Namnbyte, path, senast ändrad, kan läsas/skrivas, skapa mapp, få lista på filer i en mapp etc.
8
Ex. filkopiering import java.io.*; public class FileCopy {
public static void main(String[] args) { try { // Skapa filobjekt in/ut File src = new File(args[0]); File dest = new File(args[1]); // Skapa filströmmar in/ut FileReader srcStream = new FileReader(src); FileWriter destStream = new FileWriter(dest); // Copy file int c; while ((c = srcStream.read()) != -1) { destStream.write(c); } srcStream.close(); destStream.close(); System.out.println("FileCopy performed succesfully"); } // try catch (FileNotFoundException e) { System.err.println("File not found: " + args[0]); } catch (IOException e) { System.err.println("I/O error: " + e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("<usage: pgm sourceFile destFile>"); } } //main } // class FileCopy
9
Undantag (Exceptions)
Fångar upp fel under exe-kveringen av ett program: Läsa i en tom fil Skriva i skrivskyddad fil Dividera 1 med 0 Överskridande av index i matris Etc. Med undantagshatering kan man bestämma hur sådana fel ska hanteras i programmet. Egna undantag kan skapas.
10
Catch-blocket utförs endast vid fel i try-blocket
Syntax för undantag static void felFångare() { try { // Här görs något som kan leda // t ex till ett fel av typ // NumberFormatException kastas } catch (NumberFormatException e) { // Här görs något med anledning av // det kastade undantaget e Catch-blocket utförs endast vid fel i try-blocket Flera catch-block kan förekomma!
11
import java.io.*; public class DoubleInput { InputStreamReader in = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(in); String input = null; public static void main(String[] args) throws IOException { DoubleInput dd = new DoubleInput(); // Mata in flyttal double d = dd.getDouble(); System.out.println("Du matade in flyttalet: " + d); } public double getDouble() throws IOException { System.out.print("Ge ett flyttal: "); input = br.readLine(); double d = Double.valueOf(input).doubleValue(); return d; } // getDouble() ************************************************ Ge ett flyttal: 2.56 Du matade in flyttalet: 2.56 Ge ett flyttal: Hej java.lang.NumberFormatException: Hej at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1176) … Exception in thread "main"
12
import java.io.*; public class DoubleInput { InputStreamReader in = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(in); String input = null; public static void main(String[] args) { DoubleInput dd = new DoubleInput(); // Mata in flyttal double d = dd.getDouble(); System.out.println("Du matade in flyttalet: " + d); } public double getDouble() { while (true) { try { System.out.print("Ge ett flyttal: "); input = br.readLine(); double d = Double.valueOf(input).doubleValue(); return d; catch (IOException e) {;} catch (NumberFormatException ee) {System.out.println("Inget flyttal!");} } // getDouble() **************************************************** Ge ett flyttal: asw ee Inget flyttal! Ge ett flyttal: 1.332 Du matade in flyttalet: 1.332
13
Utöver catch-block kan även finally-block förekomma (efter catch-blocken)
Satser i ett finally-block exekveras även om try-blocket fungerar felfritt. Kan t ex användas för att stänga in- eller ut-ström till fil, internet etc.
14
Trådar Med trådade program kan exekvering pågå på flera ställen i programmet samtidigt En sorts (falsk) parallell-exekvering åstadkoms via trådar Datorn växlar snabbt och omärkligt mellan de olika trådarna Hur trådarna fungerar beror på operativsystemet Java har inbyggt stöd för trådar (Threads). Kan skapas via: Arv av klassen Thread Implemetering av gränssnittet (interface) Runnable
15
Enkelt tråd-ex I (arv av Thread)
import java.io.*; public class SimpleThread { public static void main(String[] args) { // Create thread objects TestThread tt1 = new TestThread( ,"Thread 1"); TestThread tt2 = new TestThread(50,"Thread 2"); // Start threads tt1.start(); tt2.start(); // Print results System.out.println("Tråd tt1: " + tt1.sum); System.out.println("Tråd tt2: " + tt2.sum); } // main } // class SimpleThread ************************************************************ public class TestThread extends Thread{ int number, sum; String name; public TestThread(int i, String s) { this.number = i; this.name=s; } // constructor public void run() { for (int i=0;i<number;i++) sum = sum + i; System.out.println(name + ": sum: " + sum); } // run } // class TestThread ************************************************************* Tråd tt1: 0 Tråd tt2: 0
16
Enkelt tråd-ex II (arv av Thread)
import java.io.*; public class SimpleThread { public static void main(String[] args) { TestThread tt1 = new TestThread( ,"Thread 1"); TestThread tt2 = new TestThread(50,"Thread 2"); tt1.start(); tt2.start(); try { tt1.join(); tt2.join(); } catch (InterruptedException e) {;} System.out.println("Tråd tt1: " + tt1.sum); System.out.println("Tråd tt2: " + tt2.sum); } // main } // class SimpleThread ************************************************* Tråd tt1: Tråd tt2: 1225
17
Enkelt tråd-ex III (impl. av Runnable)
import java.io.*; public class ThreadRun { public static void main(String[] args) { // Create thread object Thread t1 = new Thread(new TestRunnable(25, "Tråd_1")); Thread t2 = new Thread(new TestRunnable(25, "Tråd_2")); // Start threads t1.start(); t2.start(); } // main() } // class ThreadRun ************************************************* public class TestRunnable implements Runnable { String name; int number; public TestRunnable(int num, String s) { this.number=num; this.name=s; } // constructor public void run() { for (int i=0;i<number;i++) System.out.print(name + ". "); } // run }
18
Enkelt tråd-ex III (impl. av Runnable) Resultat av exekvering
Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_2. Tråd_1. Tråd_2. Tråd_1. Tråd_2. Tråd_1. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_1. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Tråd_2. Icke-trådad exekvering hade givit utskrift med 25 Tråd_1 följt av 25 Tråd_2
19
Fler exempel på trådmetoder (endast vid arv av Thread):
suspend() (stoppa exekvering) resume() (återuppta exek.) sleep(tid) (vila angiven tid) setPriority(int prio) (ange priritet för tråd) etc
20
Fördelar med trådar Oundgängligt vid grafiska gränssnitt
Arbete kan utföras i bakgrunden Utskrifter Nedladdning av filer från Internet Etc Växling mellan trådar är mindre resurskrävande än växling mellan olika processer Internetservrar kan behandla flera clienter samidigt
21
Faror med trådar Om flera trådar behandlar samma objekt (t ex en fil) kan oväntade saker hända… Kan förhindras via syn-kronisering (synchronized) av metoder eller programblock
22
Transaktion på bankkonto:
class Konto { private double saldo; ... public void transaktion(double belopp) { saldo = saldo + belopp; } Möjlig händelse: Tråden i obj bankomat har precis hunnit utföra saldo+belopp ovan Tråden i obj bankomat blir avbruten, tråd i obj giro startar och utför saldo + belopp. Tråden i obj giro är färdig och tråden bankomat återupptar sitt arbete.
23
Åtgård class Konto { private double saldo; ... public synchronized void transaktion(double belopp) { saldo = saldo + belopp; } Synchronized medför att endast ett objekt i taget får använda metoden.
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.