[ Pobierz całość w formacie PDF ]
jednego dla wstrzymania i wznowienia w tku i drugiego dla zatrzymania w tku. W przypadku
operacji wstrzymania i wznowienia w tku, je li odpowiedni znacznik nie jest ustawiony,
metoda run() musi kontynuowa wykonywanie w tku. W przeciwnym razie musi wstrzyma
swoje dzia anie. Je li ustawiony jest drugi ze znaczników, oznaczaj cy zatrzymanie w tku,
metoda run() musi zako czy dzia anie.
Na listingu 11.11 przedstawi em jeden ze sposobów implementacji w asnych wersji metod
suspend(), resume() i stop().
Listing 11.11. Suspend.java
// Wstrzymywanie, wznawianie i zatrzymywanie w tku.
class MyThread implements Runnable {
Thread thrd;
boolean suspended; Powoduje wstrzymanie wykonania w tku, gdy ma warto true.
boolean stopped; Powoduje zako czenie wykonania w tku, gdy ma warto true.
MyThread(String name) {
thrd = new Thread(this, name);
suspended = false;
stopped = false;
thrd.start();
}
// Punkt wej cia do w tku.
public void run() {
System.out.println(thrd.getName() + " rozpoczyna dzia anie.");
try {
for(int i = 1; i
System.out.print(i + " ");
if((i%10)==0) {
System.out.println();
Thread.sleep(250);
}
// U ywa bloku synchronized, aby sprawdzi
// warto ci sk adowych suspended i stopped.
synchronized(this) { Ten blok synchronized sprawdza warto ci sk adowych
while(suspended) { suspended i stopped.
wait();
}
if(stopped) break;
}
Poleć książkę
Kup książkę
394 Java. Przewodnik dla pocz tkuj cych
}
} catch (InterruptedException exc) {
System.out.println(thrd.getName() + " zosta przerwany.");
}
System.out.println(thrd.getName() + " ko czy dzia anie.");
}
// Zatrzymuje w tek.
synchronized void mystop() {
stopped = true;
// Poni sze instrukcje umo liwiaj zatrzymanie w tku,
// którego wykonanie zosta o wstrzymane.
suspended = false;
notify();
}
// Wstrzymuje dzia anie w tku.
synchronized void mysuspend() {
suspended = true;
}
// Wznawia dzia anie w tku.
synchronized void myresume() {
suspended = false;
notify();
}
}
class Suspend {
public static void main(String args[]) {
MyThread ob1 = new MyThread("W tek potomny klasy MyThread");
try {
Thread.sleep(1000); // umo liwia rozpocz cie wykonywania w tku ob1
ob1.mysuspend();
System.out.println("Wstrzymuj w tek.");
Thread.sleep(1000);
ob1.myresume();
System.out.println("Wznawiam w tek.");
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Wstrzymuj w tek.");
Thread.sleep(1000);
ob1.myresume();
System.out.println("Wznawiam w tek.");
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Zatrzymuj w tek.");
ob1.mystop();
Poleć książkę
Kup książkę
Rozdzia 11. Programowanie wielow tkowe 395
} catch (InterruptedException e) {
System.out.println("W tek g ówny zosta przerwany");
}
// czeka na zako czenie w tku
try {
ob1.thrd.join();
} catch (InterruptedException e) {
System.out.println("W tek g ówny zosta przerwany");
}
System.out.println("W tek g ówny ko czy dzia anie.");
}
}
Poni ej przedstawi em rezultat dzia ania programu (mo e nieco ró ni si w Twoim przypadku).
W tek potomny klasy MyThread rozpoczyna dzia anie.
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 28 29 30
31 32 33 34 35 36 37 38 39 40
Wstrzymuj w tek.
Wznawiam w tek.
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
Wstrzymuj w tek.
Wznawiam w tek.
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
101 102 103 104 105 106 107 108 109 110
111 112 113 114 115 116 117 118 119 120
Zatrzymuj w tek.
W tek potomny klasy MyThread ko czy dzia anie.
W tek g ówny ko czy dzia anie.
Program ten dzia a w nast puj cy sposób. Klasa MyThread definiuje dwie zmienne typu boolean
o nazwach suspended i stopped, które zarz dzaj operacjami wstrzymania i zatrzymania w tku.
Konstruktor klasy MyThread nadaje tym zmiennym warto pocz tkow false. Metoda run()
zawiera blok synchronized, który sprawdza warto zmiennej suspended. Je li jest ona równa
true, wywo uje metod wait(), aby wstrzyma dzia anie w tku. Aby wstrzyma dzia anie
w tku, wywo ujemy metod mysuspend(), która nadaje zmiennej suspended warto true.
Aby wznowi w tek, wywo ujemy metod myresume(), która nadaje zmiennej suspended
warto false i wywo uje metod notify().
Aby zako czy w tek, wywo ujemy metod mystop(), która nadaje zmiennej stopped warto
true. Dodatkowo metoda mystop() nadaje zmiennej suspended warto false, a nast pnie
wywo uje metod notify(). Jest to konieczne, aby zako czy w tek, którego wykonanie zosta o
[ Pobierz całość w formacie PDF ]