Wątek (ang. thread) – to część programu wykonywana jednocześnie z innymi operacjami, procesami, np: zapis danych na nośnik CD i jednocześnie wydruk treści z dokumentu Word. Aby program nie zawiesił swojej pracy wykorzystuje się wielowątkowość, przełączanie się w krótkich odcinkach czasu między procesami, tak że mamy wrażenie jakby programy działały „równolegle”, bez opóźnień.
Schemat tworzenia i uruchamiania wątku w Javie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class Zadanie implements Runnable { // implementujemy interfejs Runnable // metoda run() uruchamia zadanie, które wątek ma wykonać public void run() { } // inne operacje / metody etc ... } class Test { public static void main(String[] args) { // tworzymy nowe zadanie dla obiektu Runnable Runnable z = new Zadanie(); // tworzymy nowy wątek, //któremu przekazujemy zadanie do wykonania Thread watek = new Thread(z); // wywołujemy wątek realizacji // - na samym spodzie stosu umieszczona jest metoda run() watek.start(); } } |
Interfejs Runnable wchodzi w skład pakietu java.lang, dlatego nie musi być importowany do programu. Decyzję o kolejności wykonywania wątków, czasie ich trwania oraz stanie (uruchamialny / uruchomiony / zablokowany) podejmuje mechanizm zarządzający i praktycznie nie jesteśmy w stanie tego kontrolować. Jedynym sposobem jest usypianie wątków – sleep. Ale o tym za chwilę.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Watki implements Runnable { public void run() { cos(); } public void cos() { System.out.println("Wątek :)"); } } |
Kod klasy testującej:
1 2 3 4 5 6 7 8 9 10 11 |
public class Tester { public static void main(String[] args) { Runnable w = new Watki(); Thread watek = new Thread(w); watek.start(); System.out.println("Tester :D"); } } |
Powyższy przykład wyświetli:
1 2 |
Tester :D Wątek :) |
lub:
1 2 |
Wątek :) Tester :D |
Jak widać mechanizm zarządzający wątkami jest nieprzewidywalny. Aby otrzymać zawsze ten sam wynik możemy uśpić wątek za pomocą metody sleep:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Watki implements Runnable { public void run() { cos(); } public void cos() { try { Thread.sleep(1000); // usypiamy wątek na 1 sekundę } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Wątek :)"); } } |
Możemy uruchomić również kilka wątków, np:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Tester { public static void main(String[] args) { Runnable w = new Watki(); Thread watek1 = new Thread(w); Thread watek2 = new Thread(w); Thread watek3 = new Thread(w); watek1.start(); watek2.start(); watek3.start(); System.out.println("Test ..."); } } |