Konkurens programozás
A Java lehetőséget biztosít a párhuzamos programozásra. A Concurrency API központi eleme a Thread
osztály, mely lehetővé teszi, hogy külön CPU szálakon futtassuk programunk különböző részeit.
Szálat több módon is létre tudunk hozni.
- Runnable átadása
- Thread kiterjesztése
public static void main(String[] args) {
Thread thread = new Thread(() -> System.out.println(\"asd\"));
thread.start();
}
class PlayerThread extends Thread {
@Override
public void run() {
System.out.println("Player moves.");
}
}
public static void main(String[] args) {
PlayerThread playerThread = new PlayerThread();
playerThread.start();
}
Szál műveletek
Elnevezés
A szálaknak van egy név adattagja, ami getteren keresztül lekérhető és setteren keresztül beállítható.
playerThread.setName("asd");
playerThread.getName();
Stop (deprecated)
Leállítja az adott szálat.
Nem biztonságos, használata könnyen a program meghibásodásához vezethet.
setDaemon()
Átállítja a szál fajtáját user
vagy daemon
szálra. A daemon
szálak alacsony prioritású háttérben futó segédfolyamatok futtatására használatosak. A JVM addig fut amíg van futó user
szál;
public class DaemonTest {
static class Daemon extends Thread {
Daemon() {
super();
this.setDaemon(true);
}
@Override
public void run() {
try {
Thread.sleep(3000);
System.out.println("asd");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
Thread daemon = new Daemon();
daemon.start();
}
}
Például ebben a kódrészletben nem kerül kiiírásra semmi, mivel a main thread a deamon szál inidítása után egyből véget ér.
Az isDaemon()
metódussal lekérhető, hogy egy adott szák daemon szál-e.
join()
Felfüggeszti a szál futtatását amíg, a szál amire meg meghívjuk véget nem ér. Például ha az előző példát így módosítanánk:
public static void main(String[] args) {
Thread daemon = new Daemon();
daemon.start();
daemon.join();
}
Akkor a fő szál bevárja a daemon befejeződését így megtörténik az amúgy elmaradt kiíratás.
Ha több szált is be akarunk várni, akkor a join()
hívások sorrendje nem számít.
sleep()
Thread
osztály statikus metódusa, felfüggeszti a megadott szál futtatását a megadott időre (milliszekundumban).
Thread.sleep(3000);