[ Pobierz całość w formacie PDF ]
oczekiwania z dok adno ci do pojedynczych nanosekund. Poni ej przedstawi em ogóln posta metod notify() i notifyAll(): final void notify( ) final void notifyAll( ) Wywo anie metody notify() powoduje wznowienie wykonywania oczekuj cego w tku. Wywo anie metody notifyAll() powiadamia wszystkie w tki, a dost p do obiektu uzyskuje w tek o najwy szym priorytecie. Zanim przyjrzymy si przyk adowi zastosowania tych metod, musz uczyni jeszcze jedn wa n uwag . Chocia w normalnych warunkach metoda wait() powoduje oczekiwanie w tku na wywo anie metody notify() lub notifyAll(), istnieje bardzo rzadko spotykana mo liwo , e w tek zako czy oczekiwanie na skutek tak zwanego fa szywego przebudzenia. Omówienie skomplikowanych warunków, które prowadz do takiej sytuacji, wykracza poza zakres tej ksi ki. Ze wzgl du na mo liwo wyst pienia fa szywego przebudzenia w tku firma Oracle zaleca wywo ywanie metody wait() w p tli sprawdzaj cej warunek, na którego spe nienie oczekuje w tek. W nast pnym przyk adzie zastosujemy t technik . Przyk ad u ycia metod wait() i notify() Aby atwiej Ci by o zrozumie zastosowania metod wait() i notify(), stworzymy teraz program symuluj cy tykanie zegara przez wy wietlanie na przemian s ów tik i tak . W tym celu stworzymy klas TickTock zawieraj c dwie metody: tick() i tock(). Metoda tick() wy wie- tli s owo "tik", a metoda tock() s owo "tak". Aby uruchomi symulacj zegara, utworzymy dwa w tki, z których jeden b dzie wywo ywa metod tick(), a drugi metod tock(). W tki te musz by wykonywane w taki sposób, aby program wy wietla na przemian s owa tik i tak . Kod ród owy programu przedstawi em na listingu 11.10. Listing 11.10. ThreadCom.java // U ywa metod wait() i notify() // do stworzenia symulacji zegara. class TickTock { Poleć książkę Kup książkę 388 Java. Przewodnik dla pocz tkuj cych String state; // przechowuje stan zegara synchronized void tick(boolean running) { if(!running) { // zatrzymuje zegar state = "ticked"; notify(); // powiadamia oczekuj cy w tek return; } System.out.print("tik "); state = "ticked"; // zmienia stan zegara na "ticked" notify(); // umo liwia wykonanie metody tock() Metoda tick() powiadamia metod tock(). try { while(!state.equals("tocked")) wait(); // oczekuje na zako czenie metody tock() Metoda tick() czeka na zako czenie } metody tock(). catch(InterruptedException exc) { System.out.println("W tek zosta przerwany."); } } synchronized void tock(boolean running) { if(!running) { // zatrzymuje zegar state = "tocked"; notify(); // powiadamia oczekuj cy w tek return; } System.out.println("tak"); state = "tocked"; // zmienia stan zegara na "tocked" notify(); // umo liwia wykonanie metody tick() Metoda tock() powiadamia metod tick(). try { while(!state.equals("ticked")) wait(); // oczekuje na zako czenie metody tick() Metoda tock() czeka } na zako czenie metody tick(). catch(InterruptedException exc) { System.out.println("W tek zosta przerwany."); } } } class MyThread implements Runnable { Thread thrd; TickTock ttOb; // Tworzy nowy w tek. MyThread(String name, TickTock tt) { thrd = new Thread(this, name); ttOb = tt; thrd.start(); // uruchamia w tek } // Rozpoczyna wykonywanie nowego w tku. Poleć książkę Kup książkę Rozdzia 11. Programowanie wielow tkowe 389 public void run() { if(thrd.getName().compareTo("tik") == 0) { for(int i=0; i ttOb.tick(false); } else { for(int i=0; i ttOb.tock(false); } } } class ThreadCom { public static void main(String args[]) { TickTock tt = new TickTock(); MyThread mt1 = new MyThread("tik", tt); MyThread mt2 = new MyThread("tak", tt); try { mt1.thrd.join(); mt2.thrd.join(); } catch(InterruptedException exc) { System.out.println("W tek g ówny zosta przerwany."); } } } A oto wynik dzia ania tego programu: tik tak tik tak tik tak tik tak tik tak Przyjrzyjmy si bli ej dzia aniu tego programu. Sercem symulacji zegara jest klasa TickTock. Zawiera ona dwie metody, tick() i tock(), które komunikuj si ze sob , aby zagwarantowa , e po metodzie tick() zostanie zawsze wykonana metoda tock(), a po niej znowu metoda tick() i tak dalej. Zwró uwag na sk adow state. Gdy dzia a symulacja zegara, sk adowa state przechowuje a cuch "ticked" lub "tocked" informuj cy o bie cym stanie zegara. Metoda main() tworzy obiekt tt klasy TickTock i u ywa go do uruchomienia dwóch w tków potomnych. W tki te opieraj si na obiektach typu MyThread. Konstruktor klasy MyThread ma dwa para- [ Pobierz całość w formacie PDF ] |