You are on page 1of 32

Java végrehajtási szálak

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

megvalósító objektumot, illetve a


szálcsoportot adhatjuk meg (több szál
alkothat egy szálcsoportot, amely a
ThreadGroup osztály objektumával
jellemezhető
 Metódusok
Java 6
A Thread osztály néhány
metódusa
 String getName();
 a szál nevét adja vissza

 ha nincs általunk megadott név, akkor a

rendszer generál egyet, amely "Thread-"+n


alakú, ahol n egy egész szám.
 sleep
 felfüggeszti a szál futását a paraméterben

megadott ideig (milliszekundumban kifejezve)


 start
 elindítja a szálat.

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

public class Main {


public static void main(String[] args) {
KiirSzal elsoSzal = new KiirSzal("elso", 2, 3000);
KiirSzal masodikSzal = new KiirSzal("masodik", 6,1000);
elsoSzal.start();
masodikSzal.start();
}
}
Java 10
Lehetséges kimenet
Szal: masodik
Szal: elso
Szal: masodik
Szal: masodik
Szal: elso
Szal: masodik
Szal: masodik
Szal: masodik
Java 11
A Runnable interfész
 A Runnable interfész egyetlen
void run();
metódussal rendelkezik.

Java 12
Szál létrehozása a Runnable
interfész megvalósításával

 Létrehozunk egy osztályt, amely megvalósítja a


Runnable interfészt. Ennek az osztálynak a
példányait Runnable objektumoknak nevezzük.
 Megadjuk a run metódust, amely a szál által
végrehajtandó kódot tartalmazza.
 Létrehozzuk a Thread osztály objektumát úgy,
hogy a konstruktorban megadunk egy
Runnable objektumot.

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

public class SajatRunnable implements Runnable {


private int ido;
private int ismetles;
public SajatRunnable(int ismetles, int ido) {
this.ido = ido;
this.ismetles = ismetles;
}
Java 15
A run metódus
@Override
public void run() {
for(int i = 0; i < ismetles; ++i) {
System.out.println("Szal: " + Thread.currentThread().getName());
try {
Thread.sleep(ido);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Java 16
A Main osztály
public class Main {
public static void main(String[] args) {
Thread elsoSzal = new Thread(
new SajatRunnable(2, 3000), "elso");
Thread masodikSzal = new Thread(
new SajatRunnable(6, 1000), "masodik");
elsoSzal.start();
masodikSzal.start();
}
}
Java 17
Szálak prioritása
 A prioritás mértéke egy egész számmal
jellemezhető, amely 1 és 10 között kell legyen.
 MAX_PRIORITY = 10
 MIN_PRIORITY = 1
 NORM_PRIORITY = 5 (alapértelmezett)
 A prioritás mértékét a setPriority metódussal
állíthatjuk be.

Java 18
Példa - prioritás

public class PrioritasSzal extends Thread {

public PrioritasSzal(String name) {


super(name);
}

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

 A join metódussal valósítjuk meg.


 public final void join(long millis) throws
InterruptedException – megadott ideig vár.
 public final void join() throws
InterruptedException – addig vár, amíg a másik
szál be nem fejezi a műveletet. Ugyanaz, mint
join(0).

Java 25
Példa összekapcsolásra

 A Runnable interfész megvalósítására


vonatkozó példát egészítjük ki.

 SajatRunnable osztály

 VarakozoRunnable osztály

 Main osztály
Java 26
SajatRunnable osztály

public class SajatRunnable implements Runnable {


private int ido;
private int ismetles;
public SajatRunnable(int ismetles, int ido) {
this.ido = ido;
this.ismetles = ismetles;
}
Java 27
A run metódus
@Override
public void run() {
for(int i = 0; i < ismetles; ++i) {
System.out.println("Szal: " + Thread.currentThread().getName());
try {
Thread.sleep(ido);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Java 28
A VarakozoRunnable osztály

public class VarakozoRunnable implements Runnable {


Thread szal;
String nev;
public VarakozoRunnable(String nev, Thread szal) {
this.nev = nev;
this.szal = szal;
}

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

You might also like