Tart Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 Hei. Jeg har prøvd meg litt på threads og har klart å få til denne lille kodesnutten foreløpig: public class TellLangsomtTilTiTest { public static void main(String[] args) { System.out.println("TellLangsomtTilTiTest: main() starter ....."); TellangsomtTilTi tell = new TellangsomtTilTi("Objekt 1"); tell.run(); int sekunder = (int)(Math.random()*5000)+1000; System.out.println("VENT"); try{ Thread.sleep((int)sekunder); System.out.print("S"); Thread.sleep((int)sekunder); System.out.print("t"); Thread.sleep((int)sekunder); System.out.print("r"); Thread.sleep((int)sekunder); System.out.print("a"); Thread.sleep((int)sekunder); System.out.print("k"); Thread.sleep((int)sekunder); System.out.print("s"); Thread.sleep((int)sekunder); System.out.print(" "); Thread.sleep((int)000); System.out.print("F"); Thread.sleep((int)sekunder); System.out.print("e"); Thread.sleep((int)sekunder); System.out.print("r"); Thread.sleep((int)sekunder); System.out.print("d"); Thread.sleep((int)sekunder); System.out.print("i"); Thread.sleep((int)sekunder); System.out.print("g"); Thread.sleep((int)sekunder); } catch (InterruptedException e) { System.out.println("\n"+"Prosessen er avbrutt"); } finally { System.out.println("\n"+" Avslutter kjøringen."); } System.out.println("Systemet avsluttes! Teller ned: "); run(); System.out.println("Avsluttet"); } public static void run(){ try{ for(int i = 10; i >=0; i--){ Thread.sleep((int)1000); System.out.println(i); } } catch (InterruptedException e) { System.out.println("\n"+"Prosessen er avbrutt"); } finally { System.out.println("\n"+" Avslutter kjøringen."); } System.out.println(); } } Det jeg lurer på nå er: Åssen kan jeg få to (eller flere) tråder til å starte samtidig og feks skriver ut når disse to er ferdig. eksempel på output: Tråd 2 ble ferdig på 4 sekunder. Tråd 1 ble ferdig på 7 sekunder. Kan noen skrive en slik enkel liten kode for meg? Lenke til kommentar
Patton Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 Test.java: public class Test extends Thread { public static void main(String[] args) { Test thread1 = new Test("Thread 1"); Test thread2 = new Test("Thread 2"); thread1.run(); // Kaller metoden run, venter til den er ferdig thread2.run(); // Kaller metoden run, venter til den er ferdig thread1.start(); // Starter en traad og returnerer oeyeblikkelig thread2.start(); // Starter enda en traad og returnerer oeyeblikkelig } public Test(String name) { setName(name); } public void run() { long startTime = System.currentTimeMillis(); doStuff(); long delta = System.currentTimeMillis() - startTime; System.out.println(getName() + " finished after " + delta + " ms"); } public void doStuff() { try { Thread.sleep((int)(Math.random()*5000)+1000); } catch (InterruptedException ex) { } } } Forklaring: Alle traader maa begynne et sted. Naar du starter et java program, saa starter du egentlig den aller foerste traaden, nemlig main-traaden. Denne traaden kaller main(String[] args)-metoden en gang. Saa snart main-metoden er ferdig, er main-traaden ogsaa ferdig. Alle andre traader kaller alltid opp en run()-metode. I eksempelet over har jeg latt Test arve Thread og overridet run()-metoden. run()-metoden er egentlig som alle andre metoder, og kan kalles direkte hvis du vil. Hvis du vil lage en traad derimot, maa du kalle Thread.start(). Denne metoden gjoer foelgendes 1. Oppretter en ny traad. Denne traaden arbeider naa uavhengig av andre traader. 2. Metoden returnerer. I. Den nye traaden starter sin run() metode, samtidig som andre traader arbeider. Det er flere maater aa definere run()-metoden. I eksempelet over har jeg arvet Thread klassen. Det blir ofte fraraadet, og man boer helst bruke interfacet Runnable: public class Test implements Runnable { private String name; public static void main(String[] args) { Test myRunnable1 = new Test("Thread 1"); Test myRunnable2 = new Test("Thread 2"); Thread thread1 = new Thread(myRunnable1); Thread thread2 = new Thread(myRunnable2); myRunnable1.run(); myRunnable2.run(); thread1.start(); thread2.start(); } public Test(String name) { setName(name); } public void run() { long startTime = System.currentTimeMillis(); doStuff(); long delta = System.currentTimeMillis() - startTime; System.out.println(getName() + " finished after " + delta + " ms"); } public void doStuff() { try { Thread.sleep((int) (Math.random() * 5000) + 1000); } catch (InterruptedException ex) { } } public String getName() { return this.name; } public void setName(String aName) { this.name = aName; } } Eksempel nr 2 gjoer akkurat det samme som eksempel nr 1, men her bruker jeg instanser av Test-klassen som argument for konstruktoren Thread(Runnable). Lenke til kommentar
Tart Skrevet 28. juli 2006 Forfatter Del Skrevet 28. juli 2006 Kjempeflott. Tusen takk for ett bra svar =) Lenke til kommentar
blackbrrd Skrevet 9. oktober 2006 Del Skrevet 9. oktober 2006 man kan jo også bare lage en anonym Thread og implementere run metoden. Ta følgende lille kodesnutt i klassen Test med metoden testMe() new Thread() { public void run() { Test.this.testMe(); } }.start(); Denne kodesnutten kan legges i hvilken som helst av Test sine metoder og vil da starte en ny tråd som kjører testMe(). Av og til så er det jo litt overkill å lage en egen klasse når man bare vil kjøre en metode asynkront - f.eks en backgroundloader. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå