Øvelser - Tråde - Threads
Før du går i gang
Lav et nyt projekt. Kald det fx. concurrency
. Gerne et maven-projekt. Lav en package med navnet ´threads´, hvori du ligger koden til de næste øvelser.
Øvelse 1: Tre tråde
Denne øvelse handler om grundliggende anvendelse af tråde i Java.
start
stop
Thread
Runnable
Thread.sleep()
Skriv et program, der starter tre forskellige tråde:
- Task-1 : Beregner og udskriver summen af alle tal fra 1 til en milliard.
- Task-2 : Udskriver tallene fra 1 til 5. Holder 2 sekunders pause mellem hvert tal.
- Task-3 : Udskriver alle tal fra 10 og opefter. Holder pause i 3 sekunder mellem hvert tal.
Programmet skal stoppe Task-3 efter 10 sekunder.
- Hint-0: Lav først en package i
threads
og kald den forexercise01
. Lav tre klasser som implementerer Runnable interfacet. Lav også en Main klasse, hvorfra du kører koden. - Hint-1: Brug en long til at beregne summen i Task-1.
- Hint-2: Lad main-tråden “sove” i 10 sekunder efter Task-3 er startet.
- Hint-3: Du kan stoppe Task-3 ved at indsætte en boolean variabel i løkken i run-metoden, som kan ændres fra main-tråden.
Øvelse 2: Start/stop/afbryd en tråd
Før du går i gang
Lav en ny package: exercise02
.
class WorkerCancelable implements Runnable{
boolean keepRunning = true;
Thread thread;
public void run() {
thread = Thread.currentThread();
while(keepRunning){
System.out.println("Hello");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void cancel() {
keepRunning = false;
}
}
public class ThreadExercise02 {
public static void main(String[] args) throws InterruptedException {
WorkerCancelable worker = new WorkerCancelable();
Thread t = new Thread(worker);
t.start();
System.out.println("DONE");
}
}
2.1 Hvad gør koden?
Tag et kig på koden ovenfor, og se, om du kan forudse, hvad den gør (udskriver) UDEN faktisk at udføre koden. Tip: Hvis du kørte koden, bliver du sandsynligvis nødt til at stoppe den ved at trykke på den “røde” knap i IntelliJ ;-)
2.2 Modificer koden (i hovedet)
Find på de nødvendige ændringer (UDEN at køre koden), der skal til, for at koden udskriver dette, når den udføres:
Hello (wait a second) Hello (wait a second) Hello (wait a second) DONE
2.3 Kør koden
Hvis det ikke allerede er gjort, skal du kopiere koden ind i et projekt i IntelliJ og verificere dine forudsigelser ovenfor.
2.4 Afbrydelse af en tråd (interrupt)
I din run-metode skal du ændre sleep-tiden fra 1 sekund til 60 sekunder. Tilføj de nødvendige ændringer for at udskrive et enkelt “Hello” efterfulgt af et “Done” efter 4 sekunder.
Tip: Hvis du afbryder tråden (med *interrupt`), ophæver du blokeringen, så find ud af, hvor du skal gøre det.