[[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");
}
}