[[oktatas:programozás:java|< Java]] ====== Java szálkezelés ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Szerkesztve: 2014, 2016 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|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 ===== 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. 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 ===== 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 ===== 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 ===== 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..."); } } public class App { public static void main(String[] args) throws Exception { FileHandler fileHandler = new FileHandler(); new Thread(() -> fileHandler.write()).start(); System.out.println("Kiírás hívása után"); } }