Professional Documents
Culture Documents
10 Java Szalak
10 Java Szalak
Darvay Zsolt
Áttekintés
Szál létrehozása
Szálak prioritása
Szálak összekapcsolása
Java 2
Szál létrehozása
Két lehetőség:
A Thread osztályból származtatott osztály
segítségével (java.lang.Thread).
A Runnable interfész megvalósítása által
(java.lang.Runnable).
Java 3
Szál létrehozása
a Thread osztály alosztályával
A Thread osztályból származtatott osztályt
hozunk létre.
Felülírjuk a run metódust, a szál által
végrehajtandó kód megadása érdekében.
Az aloszály konstruktorában általában
meghívjuk az ős osztály konstruktorát (a
szokásos módon, a super segítségével.
Az alosztály objektumára a start metódust
hívjuk meg a szál elindítása érdekében.
Java 4
A Thread osztály
Az Object leszármazottja és megvalósítja
a Runnable interfészt.
Beágyazott osztály: State (a szál
állapota).
Beágyazott interfész:
UncaughtExceptionHandler (a szál
váratlan leállása esetén az interfészt
megvalósító osztály biztosíthat egy
kezelőt).
Java 5
A Thread osztály
Mezők (prioritásra vonatkozó statikus
konstansok: MAX_PRIORITY, MIN_PRIORITY,
NORM_PRIORITY)
Konstruktorok
a szál nevét, a Runnable interfészt
Java 7
Példa - származtatás
public class KiirSzal extends Thread {
private int ido;
private int ismetles;
public KiirSzal() {
} // szükség van egy alapértelmezett konstruktorra
public KiirSzal(String name, int ismetles, int ido) {
super(name);
this.ido = ido;
this.ismetles = ismetles;
}
Java 8
A run metódus
@Override
public void run() {
for(int i = 0; i < ismetles; ++i) {
System.out.println("Szal: " + getName());
try {
sleep(ido);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} Java 9
A Main osztály
Java 12
Szál létrehozása a Runnable
interfész megvalósításával
Java 13
A szál indítása és leállása
A Thread oszály objektumára meghívjuk a start
metódust, amellyel elindítjuk a szálat.
A start metódus azonnal visszatér, mihelyt a
szál megszületik.
A szál a run metódusban megadott kódot hajtja
végre.
A szál befejeződik, ha a run metódus véget ért
(kivétel kiváltásával vagy a nélkül).
Java 14
Példa – Runnable interfész
Java 18
Példa - prioritás
Java 19
A run metódus
@Override
public void run() {
for(int i = 0; i < 10; ++i) {
System.out.format("%-2s", getName());
if (i % 5 == 4)
System.out.println();
try {
sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} Java 20
A Main osztály
public class Main {
public static void main(String[] args) {
Thread th0 = new PrioritasSzal("0");
th0.setPriority(Thread.MAX_PRIORITY);
Thread th1 = new PrioritasSzal("1");
th1.setPriority(Thread.MIN_PRIORITY);
th0.start();
th1.start();
}
}
Java 21
Lehetséges kimenet
Ha a sleep nincs jelen:
000001
00000
1111
11111
Java 22
Lehetséges kimenet
Ha a sleep jelen van:
010101010
1
010101010
1
Java 23
Démon szálak
Sajátos, alacsony prioritású szálak.
A háttérben működnek. Akkor kapnak
vezérlést, ha a többi szál nem igényli.
A setDaemon metódussal alakíthatunk át
démon szállá egy meglévő szálat.
A szemétgyűjtő algoritmus is egy démon
szál keretében fut.
Java 24
Szálak összekapcsolása
Java 25
Példa összekapcsolásra
SajatRunnable osztály
VarakozoRunnable osztály
Main osztály
Java 26
SajatRunnable osztály
Java 29
A VarakozoRunnable osztály
@Override
public void run() {
try {
szal.join();
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Szal: " + nev);
}
}
Java 30
A Main osztály
public class Main {
public static void main(String[] args) {
Thread elsoSzal = new Thread(
new SajatRunnable(6, 500), "elso");
Thread masodikSzal = new Thread(
new VarakozoRunnable("masodik", elsoSzal));
elsoSzal.start();
masodikSzal.start();
}
}
Java 31
Kimenet
• Szal: elso
• Szal: elso
• Szal: elso
• Szal: elso
• Szal: elso
• Szal: elso
• Szal: masodik
Java 32