model wsp bie no ci w javie n.
Download
Skip this Video
Download Presentation
Model współbieżności w Javie

Loading in 2 Seconds...

play fullscreen
1 / 44

Model współbieżności w Javie - PowerPoint PPT Presentation


  • 107 Views
  • Uploaded on

Model współbieżności w Javie. autor: Grzegorz Szuba. Współbieżność - a co to takiego?. Współbieżność to jednoczesne wykonywanie współpracujących i komunikujących się ze sobą wątków W komputerach jednoprocesorowych współbieżność jest emulowana, w danym momencie wykonywany jest tylko jeden wątek.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Model współbieżności w Javie' - monifa


Download Now An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
wsp bie no a co to takiego
Współbieżność - a co to takiego?
  • Współbieżność to jednoczesne wykonywanie współpracujących i komunikujących się ze sobą wątków
  • W komputerach jednoprocesorowych współbieżność jest emulowana, w danym momencie wykonywany jest tylko jeden wątek
r nice mi dzy w tkiem a procesem
Różnice między wątkiem a procesem
  • Każdy wątek posiada własny wirtualny procesor
  • Wątki korzystają z tego samego egzemplarza kodu wykonywalnego
  • Wątki korzystają z tych samych danych
jak stworzy nowy w tek
Jak stworzyć nowy wątek?
  • Dziedzicząc po klasie Thread
  • Implementując interfejs Runnable
dziedziczenie po klasie thread
Dziedziczenie po klasie Thread
  • public class MyThread extends Thread {
  • public void run() {

System.out.println(”Hello world”);

}

  • Thread nowy = new MyThread();

nowy.start();

dziedziczenie po klasie thread1
Dziedziczenie po klasie Thread
  • Należy pamiętać, że w Javie można dziedziczyć tylko po jednej klasie
  • Jeśli potrzebujemy dziedziczyć po innej klasie, możemy zaimplementować interfejs Runnable
implementacja interfejsu runnable
Implementacja interfejsu Runnable
  • public class myLabel extends Label implements Runnable {
  • public void run(){

setText(”Hello world”);

}

  • myLabel nowy = new MyLabel();

Thread nowywatek = new Thread(nowy);

nowywatek.start();

stany w tk w
Stany wątków
  • nowy
  • uruchamialny
  • zablokowany
  • uśmiercony
stany w tk w nowy
Stany wątków - nowy
  • Obiekt wątku już istnieje, ale jeszcze się nie wykonuje
  • Aby rozpocząć wykonywanie, należy wywołać funkcję start()

public void start()

throws IllegalThreadStateException

  • wyjątek zostanie rzucony, gdy na rzecz danego obiektu wywoływano już metodę start()
stany w tk w uruchamialny
Stany wątków - uruchamialny
  • Wątek jest uruchomiony – wywołano już na jego rzecz metodę start() i jeśli właśnie nie działa, to tylko dlatego, że oczekuje na przydział zasobów
stany w tk w zablokowany
Stany wątków - zablokowany
  • Do sterowania wykonywaniem wątków możemy użyć następujących instrukcji:
  • sleep()
  • wait()
  • notify(), notifyAll()
  • join()
  • yield()
metoda sleep
Metoda sleep()
  • public static void sleep(long millis)

throws InterruptedException

  • public static void sleep(long millis,int nans) throws InterruptedException
  • Nie jest zwalniana blokada obiektu
  • Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku
metoda interrupt
Metoda interrupt()
  • public void interrupt()
  • Przerywa zawieszenie wątku metodami sleep, wait i join na rzecz którego jest wywołana
  • Przerwany wątek otrzyma wyjątek InterruptedException
metoda join
Metoda join()
  • Wywołując metodę join() innego wątku, zawieszamy wątek aż do zakończenia wykonania wątku, którego metodę wywołaliśmy
  • Jeśli podamy argument czasowy, wątek będzie czekał tylko przez określony czas
metoda join1
Metoda join()
  • public final void join()

throws InterruptedException

  • public final void join(long millis)

throws InterruptedException

  • public final void join(long millis, int nanos) throws InterruptedException
  • Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku
metoda yield
Metoda yield()
  • public static void yield()
  • Przerywa wykonanie wątku aby umożliwić innym wątkom wykonywanie się
  • Dotyczy to tylko wątków o takim samym lub większym priorytecie
  • Wątek od razu znajduje się w stanie „uruchamialny” – w szczególności przy braku innych wątków może się natychmiast rozpocząć wykonywać
metoda isalive
Metoda isAlive()
  • public final boolean isAlive()
  • Zwraca true jeśli wątek wykonuje swoje działanie, czyli czy wywołano już metodę start() a wątek jeszcze się nie zakończył, w przeciwnym przypadku zwraca false
stany w tk w u miercony
Stany wątków - uśmiercony
  • Zakończenie wykonania wątku następuje, gdy:
  • metoda run() zakończy swoje działanie – jest to preferowana metoda
  • wywołamy metodę destroy() (ale : nie zwolnimy blokad obiektów)
  • wywołamy metodę stop() (niezalecana, ze względu na możliwość rzucenia nieobsługiwalnego wyjątku
priorytety
Priorytety
  • Jest to mechanizm wskazywania, który wątek jest ważniejszy i powinien być częściej wykonywany
  • Nie mamy pewności co do kolejności wykonywania wątków
  • Problemy z odwzorowaniem priorytetów w różnych systemach operacyjnych
priorytety1
Priorytety
  • public final void setPriority(int newPriority)

- ustawia nowy priorytet dla wątku

  • public final int getPriority()

- zwraca aktualną wartość priorytetu

priorytety2
Priorytety
  • Stałe służące do określania wartości priorytetu :
  • public static final int MIN_PRIORITY

- minimalna wartość priorytetu

  • public static final int NORM_PRIORITY

- domyślna wartość priorytetu

  • public static final int MAX_PRIORITY

- maksymalna wartość priorytetu

slide22
import java.lang.Thread;

publicclass NumberThread extends Thread {

int myNumber;

public NumberThread( int theNumber ) {

myNumber = theNumber;

}

publicvoid run() {

System.out.println("I'm "+ myNumber +

" in priority " + getPriority());

for(int i=0; i<25; i++)

System.out.println( "My Number Is " + myNumber + " in round : " + i);

}

}

publicclass ThreadDemo {

publicstaticvoid main( String [] args ) {

NumberThread t1 = new NumberThread(1);

NumberThread t2 = new NumberThread(2);

t2.setPriority(2);

t2.start();

t1.setPriority(1);

t1.start();

}

}

slide23
I'm 2 in priority 2

My Number Is 2 in round : 0

My Number Is 2 in round : 1

My Number Is 2 in round : 2

I'm 1 in priority 1

My Number Is 1 in round : 0

My Number Is 1 in round : 1

My Number Is 1 in round : 2

My Number Is 1 in round : 3

My Number Is 2 in round : 3

My Number Is 1 in round : 4

My Number Is 2 in round : 4

My Number Is 2 in round : 5

My Number Is 2 in round : 6

My Number Is 2 in round : 7

My Number Is 2 in round : 8

My Number Is 2 in round : 9

My Number Is 2 in round : 10

My Number Is 2 in round : 11

My Number Is 2 in round : 12

My Number Is 2 in round : 13

My Number Is 2 in round : 14

My Number Is 2 in round : 15

My Number Is 1 in round : 5

My Number Is 1 in round : 6

My Number Is 1 in round : 7

My Number Is 1 in round : 8

My Number Is 1 in round : 9

My Number Is 1 in round : 10

My Number Is 1 in round : 11

My Number Is 1 in round : 12

My Number Is 2 in round : 16

My Number Is 2 in round : 17

My Number Is 2 in round : 18

My Number Is 2 in round : 19

My Number Is 2 in round : 20

My Number Is 1 in round : 13

My Number Is 1 in round : 14

My Number Is 1 in round : 15

My Number Is 2 in round : 21

My Number Is 2 in round : 22

My Number Is 2 in round : 23

My Number Is 2 in round : 24

My Number Is 1 in round : 16

My Number Is 1 in round : 17

My Number Is 1 in round : 18

My Number Is 1 in round : 19

My Number Is 1 in round : 20

My Number Is 1 in round : 21

My Number Is 1 in round : 22

My Number Is 1 in round : 23

My Number Is 1 in round : 24

w tki strasz po nocach czyli demony
Wątki straszą po nocach, czyli Demony
  • Demony to specjalne rodzaje wątków
  • Ich celem jest działanie w ”tle”
  • Wirtualna maszyna kończy pracę, gdy zakończą się wszystkie wątki nie będące demonami
demony
Demony
  • public final void setDaemon(boolean on)

- aby wątek został demonem, należy wywołać tą metodę z parametrem ”true”

- należy to zrobić przed wywołaniem na rzecz tego wątku metody start()

  • public final boolean isDaemon()

- sprawdza, czy dany wątek jest demonem

synchronizacja w tk w
Synchronizacja wątków
  • Aby lepiej zrozumieć czym jest synchronizacja, rozważmy program, którego zadaniem jest narysować linię wzdłuż przekątnej okna apletu
slide27
import java.applet.*;

import java.awt.*;

publicclass Master extends Applet implements Runnable{

Thread thread1, thread2;

int [] tablicax;

int [] tablicay;

Graphics gdc;

int wskaznik;

publicvoid init()

{

gdc = getGraphics();

thread1 = new Thread(this);

thread2 = new Thread(this);

thread1.start();

thread2.start();

tablicax = newint [100];

tablicay = newint [100];

}

publicvoid paint(Graphics gdc){

for(int i=0;i<=wskaznik;i++)

gdc.fillRect(tablicax[i], tablicay[i],1,1);

}

publicvoid run(){

for(int i=0;i<49;i++){

tablicax[wskaznik+1] = tablicax[wskaznik]+1;

System.out.print(

tablicax[wskaznik]+ " ");

wskaznik++;

System.out.print("-");

tablicay[wskaznik] =

tablicay[wskaznik-1]+1;

System.out.println(" " + tablicay[wskaznik-1] + " "+ wskaznik);

repaint();

}

}

}

synchronizacja
Synchronizacja
  • Aby uniknąć powyższej sytuacji, należy ograniczyć liczbę wątków mogących w danym momencie wykonywać pewien fragment kodu do jednego
  • W tym celu należy zsynchronizować krytyczny fragment kodu
synchronizacja metody
Synchronizacja metody
  • public synchronized void Counter()

{ ... }

  • na czas wykonania metody synchronizowanej blokowana jest możliwość wywołania jakiejkolwiek innej metody synchronizowanej danego obiektu
synchronizacja bloku instrukcji
Synchronizacja bloku instrukcji
  • synchronized (obiekt) blokInstrukcji

- na czas wykonywania blokuInstukcji dostęp do obiektu będzie zablokowany

- jeśli w momencie rozpoczęcia bloku instrukcji wyrażenie będzie już zablokowane, wątek się zawiesi w oczekiwaniu na odblokowanie

synchronizacja1
Synchronizacja

Wywołanie :

  • wskaznikNaObiekt.metodaSynchr(arg, ...);

jest równoważne wywołaniu:

  • synchronized(wskaznikNaObiekt) {

wskaznikNaObiekt.metodaNieSyn(arg, ...);

}

zwalnianie blokady obiektu
Zwalnianie blokady obiektu
  • Blokada jest zawsze zwalniana na końcu synchronizowanego bloku, nawet gdyby w wyniku wyjątku, instrukcji break lub return sterowanie wątku zostało przeniesione poza synchronizowany blok
  • Ważne jest aby w celu zawieszenia pracy wątku używać metody wait() gdyż na czas zawieszenia zwalnia ona blokadę obiektu
metoda wait
Metoda wait()
  • public final void wait()

throws InterruptedException

  • public final void wait(long timeout)

throws InterruptedException

  • public final void wait(long timeout, int nanos) throws InterruptedException
  • Powoduje wstrzymanie pracy danego wątku aż zostanie wywołana metoda notify() lub notifyAll() lub upłynie czas podany jako argument
metoda wait1
Metoda wait()
  • W przeciwieństwie do metody sleep() jest zwalniana blokada obiektu
  • Wyjątek zostanie rzucony, gdy inny wątek wywoła metodę interrupt() na rzecz tego wątku
metody notify i notifyall
Metody notify() i notifyAll()
  • public final void notify()
  • public final void notifyAll()
  • Metoda notify() powoduje obudzenie jednego, natomiast metoda notifyAll() wszystkich wątków zatrzymanych metodą wait()
metody wait notify notifyall
Metody wait(), notify(), notifyAll()
  • Metody wait(), notify, notifyAll() muszą znajdować się wewnątrz synchronizowanego bloku lub metody.
  • Jeśli zagnieździmy synchronizowane bloki lub metody, musimy pamiętać, że metody notify() i notifyAll() zwalniają blokadę tylko jednego obiektu, najbardziej wewnętrznego
uups co nie wysz o czyli zakleszczenia
Uups, coś nie wyszło, czyli Zakleszczenia
  • Gdy piszemy program używając mechanizmów synchronizacji, możemy doprowadzić do sytuacji, gdy w zestawie współdziałających wątków każdy wątek jest zawieszony lub dobrowolnie wstrzymany i nie istnieje możliwość odwieszenia ani uwolnienia jakiegokolwiek wątku
jak dochodzi do zakleszcze
Jak dochodzi do zakleszczeń
  • Do zakleszczeń dochodzi, gdy jeden wątek, po założeniu blokady na pewien obiekt, próbuje uzyskać dostęp do innego obiektu, który jest blokowany przez drugi wątek, który próbuje uzyskać dostęp do obiektu zablokowanego przez pierwszy wątek
przyk ad zakleszczenia
Przykład zakleszczenia
  • Program monitoruje pracę dwóch osób
  • Każda osoba informuje o postępach swoich i konkurenta
slide41
publicclass Worker implements Runnable {

privatelong counter = 0;

String name;

Worker other;

Worker (String name){

this.name = name;

}

Worker setOther(Worker other){

this.other = other;

returnthis;

}

synchronizedvoid showStatus(){

Master.sendMessage(name + " " + counter + ", other: " + other.peep());

}

synchronizedlong peep(){

return counter;

}

publicvoid run() {

while(true) {

counter++;

showStatus();

}

}

}

slide42
import java.io.IOException;

publicclass Master {

static Worker tom, bob;

publicstaticvoid main(String[] args)

throws IOException {

tom = new Worker("Tom");

bob = new Worker("Bob");

new Thread(tom.setOther(bob)).start();

new Thread(bob.setOther(tom)).start();

System.in.read();

}

staticsynchronizedvoid sendMessage(String string){

System.out.println(string);

}

}

i wynik dzia ania programu
I wynik działania programu:

Tom 1, other: 0

Tom 2, other: 0

Tom 3, other: 0

Bob 1, other: 3

Bob 2, other: 3

Bob 3, other: 3

Bob 4, other: 3

Bob 5, other: 3

Bob 6, other: 3

Bob 7, other: 3

Bob 8, other: 3

Bob 9, other: 3

Tom 4, other: 10

literatura
Literatura
  • Szkolenia firmy Sun na stronie https://learningcenter-sai.sun.com/
  • Dokumentacja API http://java.sun.com/j2se/1.4.2/docs/api/
  • http://www.google.pl
  • Bruce Eckel „Thinking in Java”
  • Jan Bielecki „Java od podstaw”