Tartalomjegyzék
Java szálkezelés
- Szerző: Sallai András
- Copyright © 2014, Sallai András
- Szerkesztve: 2014, 2016
- Licenc: CC BY-SA 4.0
- Web: https://szit.hu
Bevezetés
Egy egyszerű program, egyetlen szálon fut. Ha azonban több esemény is történik egyszerre, akkor szükségünk lehet több szálon futó programra. Például egy program rajzol valamit a képernyőre, miközben mi olvasni szeretnénk a billentyűzetről. A több szálas program megoldja ezt a problémát.
Szálkészítés
A Javaban két lehetőség van több szálas program készítésére. Implementálhatunk egy interfészt vagy örökíthetünk egy osztályt.
Az osztály használata esetén csak annyit kell tennünk, hogy a Thread osztályból örökítjük saját osztályunka. A Thread osztály a következő csomagban van:
java.lang
Az alábbi példában a használatára látunk egy példát.
class Szamlalo extends Thread { public void run() { //.... } }
Létrehozunk egy Szamlalo osztályt, amely örökli Thread osztályt. A Thread.run() metódust pedig felülírjuk (override). A számlálás a run() metódusban történik.
public class Szamlalo implements Runnable { Thread T; public void run() { //.... } }
Egy különszál
- Program.java
class Program { Program() { MasodikSzal szerver = new MasodikSzal(); szerver.start(); } public static void main(String argv[]) throws Exception { //Főszál new Program(); } class MasodikSzal extends Thread { public void run() { //Amit a másik szál tesz } } }
Szálpélda
A példában a főszál két másodpercenként ír ki egy szöveget, a második szál pedig egy másodpercenként.
- Program01.java
class Program02 { public static void main(String args[]) { (new Thread() { public void run() { while(true) { System.out.println("Másik szál"); try { Thread.sleep(1000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } } } }).start(); while(true) { System.out.println("Főszál"); try { Thread.sleep(2000); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } } } }
Szálpélda 2
- Program01.java
class Program05 { public static void main(String args[]) { new MasikSzal().start(); while(true) { System.out.println("Főszál"); try { Thread.sleep(2000); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } } class MasikSzal extends Thread { public void run() { while(true) { System.out.println("Másik szál"); try { Thread.sleep(4000); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } }
Szálpélda Runnable interfésszel
- Program01.java
class Program04 { public static void main(String args[]) { new Thread(new MasikSzal()).start(); while(true) { System.out.println("Főszál"); try { Thread.sleep(2000); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } } class MasikSzal implements Runnable { public void run() { while(true) { System.out.println("Másik szál"); try { Thread.sleep(4000); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } } }
Egy függvényt külön szálon egyszerűen
Runnable doing = new Runnable() { @Override public void run() { fuggvenyKulonSzalon(); } }; SwingUtilities.invokeLater(doing);
Aszinkron folyamat
- FileHandler.java
public class FileHandler { public void write() { try { this.tryWrite(); } catch (InterruptedException e) { System.err.println("Hiba az altatás során!"); } } public void tryWrite() throws InterruptedException { Thread.sleep(2000); System.out.println("Fájlkezelés árnyékeljárás..."); } }