Gyakorlati alapok III.
A többszálú programozás alapjai (multithread)
Szálmenedzsment Runnable interfésszel
Amint az már A szál (thread) és alapszintű működése című fejezetben említésre került, szálat létrehozhatunk a Runnable interfész segítségével is.
Emlékezzünk vissza: ez az interfész egy funkcionális interfész, amelynek csupán 1 db kötelezően kidolgozandó funkciója van, a jelen esetben ez a run() metódus (A funkcionális interfész és a lambda-kifejezések című fejezet). Emlékezzünk vissza arra is, hogy osztályt és interfészt az implements kulcsszóval kapcsolhatjuk össze.
Nézzük meg a futtatható Java-alapkódot, amely a szokásos módon egy for ciklusban ír ki üzenetet a konzolra:
public class Szal implements Runnable {
public void run() {
for(int i = 1; i <= 10; i++) {
System.out.println(i + ". ciklus");
}
System.out.println("Kész!");
}
public static void main (String[] args) {
Szal szal = new Szal();
szal.run();
}
}
Végeredmény:
1. ciklus
2. ciklus
3. ciklus
4. ciklus
5. ciklus
6. ciklus
7. ciklus
8. ciklus
9. ciklus
10. ciklus
Kész!
A kód lefutott, ám önmagában túl sok mindent nem tudunk kezdeni vele, mert a
szál valójában nem szálfunkcionalitással, hanem csakis az
Object osztályra jellemző fukcionalitással
(rutinokkal) rendelkezik (Az Ős, mely sokasodni foszlik: az Object osztály).
Ezen probléma megoldására a natívan elérhető Thread
osztályhoz kell nyúlnunk (java.lang.Thread),
amelyet példányosítunk és amelybe a szálat egyszerűen “becsomagoljuk” (Thread
thread = new Thread(new Szal())). Mivel a Szal
így Thread típusúvá vált, az utóbbira jellemző
összes funkcionalitás rendelkezésre fog állni. Vegyük észre, hogy ezért tudjuk
már a szálat a start() metódussal indítani:
public class Szal implements Runnable {
public void run() {
for(int i = 1; i <= 10; i++) {
System.out.println(i + ". ciklus");
}
System.out.println("Kész!");
}
public static void main (String[] args) {
Thread thread = new Thread(new Szal());
thread.start();
}
}
Végeredmény:
1. ciklus
2. ciklus
3. ciklus
4. ciklus
5. ciklus
6. ciklus
7. ciklus
8. ciklus
9. ciklus
10. ciklus
Kész!
Sőt, lehetőségünk van névtelen osztállyal is megoldanunk a problémát (new Thread(new Szal()).start()):
public class Szal implements Runnable {
public void run() {
for(int i = 1; i <= 10; i++) {
System.out.println(i + ". ciklus");
}
System.out.println("Kész!");
}
public static void main (String[] args) {
new Thread(new Szal()).start();
}
}
Végeredmény:
1. ciklus
2. ciklus
3. ciklus
4. ciklus
5. ciklus
6. ciklus
7. ciklus
8. ciklus
9. ciklus
10. ciklus
Kész!
Egy kissé másképpen:
class Szal {
public static void main(String args[]) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i = 1; i <= 10; i++) {
System.out.println(i + ". ciklus");
}
System.out.println("Kész!");
}
}).start();
}
}
Végeredmény:
1. ciklus
2. ciklus
3. ciklus
4. ciklus
5. ciklus
6. ciklus
7. ciklus
8. ciklus
9. ciklus
10. ciklus
Kész!