java14.pdf
(
182 KB
)
Pobierz
Wątki (threads)
Java - wątki
Wątki (threads)
W celu napisania kodu wątku w Javie konieczne jest albo bezpośrednie dziedziczenie z
klasy Thread lub pośrednie poprzez implementację interfejsu Runnable. Wykorzystanie
interfejsu jest szczególnie istotne wówczas, gdy dana klasa (klasa wątku) dziedziczy już
z innej klasy, a ponieważ w Javie nie może dziedziczyć z dwóch różnych klas, dlatego
konieczne jest zaimplementowanie interfejsu. Każdy wątek powinien być wywołany, mieć
opisane zadania do wykonania oraz posiadać zdolność do zakończenia jego działania.
Funkcjonalność tą, otrzymuje się poprzez stosowanie trzech podstawowych dla wątków
metod klasy Thread:
start() - jawnie wywołuje rozpoczęcie wątku,
run() - zawiera zestaw zadań do wykonania,
interrupt() - umożliwia przerwanie działania wątku.
Metoda run() nie jest wywoływana jawnie lecz pośrednio poprzez metodę start(). Użycie
metody start() powoduje wykonanie działań zawartych w ciele metody run(). Jeśli w
międzyczasie nie zostanie przerwane zadanie, w ciele którego dany wątek działa, to
końcem życia wątku będzie koniec działania metody run(). Do innych ważnych metod
opisujących działanie wątków należy zaliczyć:
static int activeCount():
- wywołanie tej metody powoduje zwrócenie liczby wszystkich aktywnych wątków danej
grupy,
static int enumerate(Thread[] tarray):
- wywołanie tej metody powoduje skopiowanie wszystkich aktywnych wątków danej grupy
do tablicy oraz powoduje zwrócenie liczby wszystkich skopiowanych wątków,
static void sleep (long ms); gdzie ms to liczba milisekund:
- wywołanie tej metody powoduje uśpienie danego wątku na czas wskazany przez liczbę
milisekund;
static yield():
- wywołanie tej metody powoduje przerwanie wykonywania aktualnego wątku kosztem
wykonywania innego wątku (jeśli taki istnieje) na Maszynie Wirtualnej. Metodę tą
stosowaliśmy omawiając proces GarbageCollection, zawieszając wątek działania programu
na rzecz wywołania wątku zwalniania pamięci (System.gc()).
Ponadto istnieją jeszcze inne metody klasy Thread, np. setName(), setDaemon(),
setPriority(), getName(), getPriority(), isDaemon(), isAlive(), isInterrupt(), join(), itd.,
które mogą być pomocne w pracy z wątkami.
- 1 -
Java - wątki
Ćwiczenie 1
//Los.java:
import java.util.*;
class Jasnosc extends Thread {
Thread j;
Jasnosc(Thread j){
this.j=j;
}
public void run(){
int n=0;
boolean b = false;
Random r = new Random();
do{
if( !(this.isInterrupted())){
n = r.nextInt();
System.out.println("Jasność");
} else {
n=200000000;
b=true;
}
}while(n<200000000);
if(b){
System.out.println(this+" jestem przerwany, kończę pracę");
} else {
Thread t = Thread.currentThread();
System.out.println("Tu wątek "+t+" Jasność");
System.out.println("Zatrzymuję wątek: "+j);
j.interrupt();
System.out.println("KONIEC: Jasność");
}
}
}// koniec class Jasnosc
class Ciemnosc extends Thread {
Thread c;
public void ustawC(Thread td){
this.c=td;
}
public void run(){
int n=0;
Random r = new Random(12345678L);
boolean b = false;
do{
if( !(this.isInterrupted())){
- 2 -
Java - wątki
n = r.nextInt();
System.out.println("Ciemność ");
} else {
n=200000000;
b=true;
}
}while(n<200000000);
if(b){
System.out.println(this+" jestem przerwany, kończę pracę");
} else {
if (c.isAlive()) {
Thread t = Thread.currentThread();
System.out.println("Tu wątek "+t+" Ciemność");
System.out.println("Zatrzymuję wątek: "+c);
c.interrupt();
} else {
Thread t = Thread.currentThread();
System.out.println("Tu wątek "+t+" jestem jedyny ");
}
System.out.println("KONIEC: Ciemność");
}
}
}// koniec class Ciemnosc
public class Los{
public static void main(String args[]){
Ciemnosc zlo = new Ciemnosc();
Jasnosc dobro = new Jasnosc(zlo);
zlo.ustawC(dobro);
zlo.start();
dobro.start();
}
}// koniec public class Los
Ćwiczenie 2
public class Gra
{
static boolean GraAktywna=true;
public static void main(String args[])
{
// tworzenie wątków (-> stan gry "New" ...)
WatekGracza Tomasz=new WatekGracza("Tomasz");
- 3 -
Java - wątki
WatekGracza Jerzy=new WatekGracza("Jerzy");
//... uruchomienie wątków (-> stan gry "Runnable")
Tomasz.start();
Jerzy.start();
// uruchomienie zegara odmierzającego czas trwania gry
new CzasGry().start();
while (CzasGry.Sekundy < 10)
{// gra zakończona
GraAktywna=false;
}
// podanie wyniku
System.out.println("Punkty uzyskane przez Tomasza: "+Tomasz.Punkty+" / Jerzego:
"+Jerzy.Punkty);
if (Tomasz.Punkty > Jerzy.Punkty)
System.out.println("Wygrał Tomasz");
else
System.out.println("Wygrał Jerzy");
}
}
class WatekGracza extends Thread
{
// liczba punktów osiągniętych przez gracza
public int Punkty;
// konstruktor wątku
public WatekGracza (String ImieGracza)
{
// konstruktor klasy bazowej wywoływany jest przez nazwę wątku
super(ImieGracza);
}
public void run()
{
int Rzut; // wynik rzutu
while (Gra.GraAktywna)
{
// rzut kośćmi
Rzut=(int)(Math.random()*6); // funkcja random z pakietu java.util
// zwiększenie liczby punktów o uzyskany wynik rzutu
- 4 -
Java - wątki
Punkty+=Rzut;
// podanie wyniku rzutu
System.out.println(getName()+" wyrzucił "+Rzut+"oczek - liczba punktów"+Punkty);
// im gorszy wynik rzutu, tym dłużej gracz musi czekać na swoją kolej
// (jeden gracz może rzucać kilkakrotnie pod rząd)
try
{
sleep ((long)(6-Rzut)*100);
}
catch (InterruptedException e)
{
// wyjątek ten zostanie usunięty kiedy bieżący potok zostanie przerwany przez
inny.
// Niniejsza instrukcja catch musi tu zostać zaimplementowana,
// w przeciwnym razie kompilator zgłosi komunikat o błędzie.
System.out.println("Wyjątek");
}
}
}
}
class CzasGry extends Thread
{
static int Sekundy=0;
public void run()
{
while (Gra.GraAktywna)
{
try {sleep(1000);}
catch (InterruptedException e) {}
Sekundy+=1;
}
}
}
Priorytety wątków
Priorytety stanowią pewien problem z punktu widzenia uniwersalności kodu w Javie. Otóż
system priorytetów danej platformy (systemu operacyjnego) musi być odwzorowany na
zakres 10 stanów. Przykładowo dla systemu operacyjnego Solaris liczba priorytetów
wynosi 231, podczas gdy dla Windows NT aktualnych priorytetów jest praktycznie 7.
- 5 -
Plik z chomika:
ell_lornzo
Inne pliki z tego folderu:
java14.pdf
(182 KB)
java13.pdf
(40 KB)
java12.pdf
(89 KB)
java11.pdf
(47 KB)
java10.pdf
(51 KB)
Inne foldery tego chomika:
c#
c++
Free Pascal
Zgłoś jeśli
naruszono regulamin