Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Relaterede dokumenter
Singleton pattern i Java

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Singleton pattern i C#

Dag 10 Flertrådet programmering

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Hvad er Objekter - Programmering

Anvendelse af metoder - Programmering

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Dag 10 Flertrådet programmering

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Java Klasse nedarvninger

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Introduction til.net remoting i C#

Hvilket sprog er hurtigst

Database design for begyndere

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Bits, bit operationer, integers og floating point

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

Real-time programming safety in Java and Ada

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Introduction til.net remoting i VB.NET

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Arkitektur for begyndere

Introduktion til SQL queries

Common Language Runtime. Multithreading

Forskellige Java versioner

Kontrol-strukturer i PHP

Nye features i Java 1.5/5.0

Parallelle algoritmer

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP

Offset til terminalskærm i Java

.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

A Profile for Safety Critical Java

Undtagelseshåndtering i C#

Introduktion til AOP i C#

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Ugeseddel 4 1. marts - 8. marts

Endnu mere om tilfældige tal

Eksempel: Skat i år 2000

Abstrakte datatyper C#-version

Introduktion til funktioner, moduler og scopes i Python

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

OOP e uge kursusgang: Samtidighed (II) Safety = sikkerhed. Safety

Java web applikationer med Tomcat

SWC eksamens-spørgsmål. Oversigt

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

14.1 Internationale programmer

Tree klassen fra sidste forelæsning

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 6

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Test af It-komponent

At klippe en streng over på det mest hensigtsmæssige sted

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Nye features i Java 1.7/7.0

.NET 4.5 og C# 5.0. Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#.

Hvilket sprog skal jeg lære?

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

DANMARKS TEKNISKE UNIVERSITET

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.

Database programmerings tips

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Parallelle algoritmer

Upload af billeder/filer for nybegyndere Del. 2

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Geografisk lokalisering i JSP

et enkelt kontrol flow sætningerne i programmet afvikles en ad gangen flowet følger dels den tekstlige rækkefølge

Videregående programmering i Java

Nye Java XML API'er

3C03 Concurrency: Model-based Design

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Klasser og objekter. (Afsnit i manualen)

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er

IT projekt person galleri

Virkefeltsregler i Java

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Kursus navn: Indledende programmering Kursus nr

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Forelæsning Uge 4 Torsdag

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

CVS som KS-værktøj E Branching, Merging m.v.

Løsning af møntproblemet

Afsending af s vha. ASP

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

JNI. Denne artikel beskriver JNI (Java Native Interface) som er måden hvorpå Java kan kalde native kode.

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Delphi - CrackMe og Keygen

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter kendskab til Java men ikke til threads. Skrevet den 16. Feb 2010 af arne_v I kategorien Programmering / Java Historie: V1.0-12/01/2004 - original V1.1-31/01/2004 - forbedret formatering + uddybning af de 2 måder V1.2-07/04/2004 - tilføj note om stop af tråd V1.3-05/08/2005 - tilføj Java 1.5 thread pool eksempel V1.4-16/02/2010 - smårettelser Hvad er threads Threads (eller tråde på dansk) er er et begreb som dækker over flere logiske eksekverings flow inden for samme program. Groft sagt kan programmet "lave flere ting samtidigt". Begrebet er ikke Java specifikt. Både Windows Threads og POSIX Threads er ældre. Men Java er designet fra starten af til at understøtte threads. En applikation med kun en tråd kaldes for en single threaded applikation, mens en med flere tråde kaldes for en multi threaded applikation. Der er 2 low level måder at starte tråde på i Java. Jeg vil kort vise begge. Simple eksempler Eksempel med extends Thread: // demo klasse public class T1 { public static void main(string[] args) throws Exception { // lav tråd objekt FirstWay t = new FirstWay(); // start tråd t.start(); // vent på tråd afslutter t.join();

// klasse der repræsenterer tråd // skal extende Thread class FirstWay extends Thread { // metode der kaldes når tråden starter // skal hedde run public void run() { System.out.println("Tråd kører"); Eksempel med implements Runnable: // demo klasse public class T2 { public static void main(string[] args) throws Exception { // lav tråd objekt Thread t = new Thread(new SecondWay()); // start tråd t.start(); // vent på tråd afslutter t.join(); // klasse der repræsenterer tråd // skal implementere Runnable class SecondWay implements Runnable { // metode der kaldes når tråden starter // skal hedde run public void run() { System.out.println("Tråd kører"); Jeg plejer at bruge den første, fordi jeg synes at det er mere indlysende hvad der sker. Specielt hvis man bruger this som argument til new Thread i den anden synes jeg at koden er forvirrende. Den anden har imidlertid en fordel nemlig at man kan bruge den selvom klassen i forvejen extender en klasse. Eksempel med mange tråde Hvis man skal starte flere tråde end en, så er følgende teknik tit brugbar:

public class T3 { private final static int N = 10; public static void main(string[] args) throws Exception { MultiThread[] t = new MultiThread[N]; for(int i = 0; i < N; i++) { t[i] = new MultiThread(new Info(i)); for(int i = 0; i < N; i++) { t[i].start(); for(int i = 0; i < N; i++) { t[i].join(); class MultiThread extends Thread { private Info inf; public MultiThread(Info inf) { this.inf = inf; public void run() { System.out.println(inf.getV()); class Info { private int v; public Info() { v = 0; public Info(int v) { this.v = v; public int getv() { return v; public void setv(int v) { this.v = v; Ting man skal være opmærksom på Der er nogle ting som man skal tage højde for i en multithreaded applikation. Man kan komme i problemer hvis to tråde arbejder på de samme data samtidigt. En tråd kan nemlig blive swappet ud midt i noget og en anden tråd kan starte. Og hvis den anden tråd modificerer data som den første tråd bruger, så kan det give sære fejl.

Det er endnu mere risikabelt på fler CPU maskiner, hvor flere tråde kan køre parallelt. Det kan være en static klasse variabel eller en normal instans variabel i et objekt som begge tråde bruger. Lokale variable indeni metoder er der aldrig problemer med. Java har imidlertid nogle indbyggede funktioner til at styre det. Hvis objektet der skal tilgåes fra flere tråder hedder o kan putte de kritiske kode omårder inden i: syncronized(o) {... så vil den pågældende kode kun blive udført af en tråd af gangen for det objekt. synlighed synchronized returtype metodenavn(...) {... har samme betydning som: synlighed returtype metodenavn(...) { synchronized(this) {... og er altså bare en nemmere måde at skrive det på. synchronized på en static metode synkroniserer tilsvarende på klassen fremfor instansen. Der findes også mere avancerede mekanismer i form af wait og notify/notifyall metoderne. Mit råd er at undgå dem hvis muligt, da de godt kan drille en del. Bemærk at join metoden venter på at tråden afslutter af sig selv. Mens stop metoden er deprecated. Hvis man vil afbryde en tråd i utide, så skal man bruge interrupt metoden. Nyt i Java 1.5 Der er en lang række spændende nyheder i Java 1.5 om threading

i java.util.concurrent pakken. Bl.a. er der indbygget support for thread pool. Her er en lille appetit vækker: import java.util.date; import java.util.concurrent.callable; import java.util.concurrent.executionexception; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.future; import java.util.concurrent.timeunit; public class ThreadPool { public static void main(string[] args) throws InterruptedException, ExecutionException { ExecutorService es = Executors.newFixedThreadPool(2); int nowork = 10; Future<Integer>[] workres = new Future[nowork]; for(int i = 0; i < nowork; i++) { workres[i] = es.submit(new SomeWork(i)); for(int i = 0; i < nowork; i++) { System.out.println(workres[i].get()); es.shutdown(); class SomeWork implements Callable<Integer> { private int v; public SomeWork(int v) { this.v = v; public Integer call() throws Exception { TimeUnit.SECONDS.sleep(5); System.out.println(v + " done at " + (new Date())); return v; Det kan anbefales at bruge java.util.concurrent klasser fremfor egne tråd klasser hvis muligt. Der er også et antal smarte data strukturer bl.a. køer til kommunikation mellem tråde. Kommentar af simonvalter d. 31. Jan 2004 1 Godt beskrevet.

Kommentar af danielhep d. 22. May 2004 2 udemærket Kommentar af conrad d. 29. Feb 2004 3 Rigtig god, man kunne måske tilføje lidt om hvordan man stopper en tråd?