[ 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 ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • mons45.htw.pl
  • Wątki
    Powered by wordpress | Theme: simpletex | © (...) lepiej tracić niż nigdy nie spotkać.