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.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


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()):

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


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!