home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Internet 2001 November / MICD2001_11_NR1.iso / Www / WebArea / index.php@id=76 < prev    next >
Text File  |  2001-09-26  |  28KB  |  491 lines

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4//PL">
  2. <html>
  3. <head>
  4. <title>WEB-AREA.org - serwis webmaster≤w</title>
  5. <link href="style.css" rel="stylesheet" type="text/css">
  6. <LINK REL="SHORTCUT ICON" HREF="favicon.ico"> 
  7. <meta http-equiv="Creation-date" content="28.08.2001">
  8. <meta http-equiv="Reply-to" content="web-area@web-area.org">
  9. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
  10. <meta name="author" content="Jakub & Jan Filipowscy">
  11. <meta name="description" content="Serwis webmasterow. Znajdziesz tu kilka kursow popularnych internetowych jezykow programowania takich jak: HTML, CSS, WML, SGML, XML, PHP, Perl i Java. Zamiescilismy tu rowniez wiele skryptow JavaScript, PHP i CGI. Przeczytac mozna kilka artykulow i sciagnac kilka szablonow. Dla poczatkujacych jest dzial BeginnerZone. ">
  12. <meta http-equiv="keywords" content="WEB-AREA, web-area, web area, web, area, WEB-AREA.org, web-area.org, webara.org,strefa webmastera, strefa, webmastera, webmaster, WEBMASTER, Webmaster, tworzenie stron www, www, strona www, internet, world wide web, design, designerswo, designer, programowanie, jΩzyki, jΩzyk programowania, php, cgi, html, java, javascript, sgml, wml, PHP, CGI, HTML, Java, JavaScript, SGML, WML, wap, standarty, skrypty php, skrypty cgi, applety java, aplety, aplety java, aplety javy, applety javy, javascripty, JavaScripty, skrypty javy, publikowanie witryny, witryna, tworzenie witryn, tworzenie sklep≤w internetowych, edytory html, tekstowe edytory html, projekt syf, szablony, Szablony, free, darmowe, zadarmo, subskrypcja, lista mailingowa, mailing list, lista subskrypcyjna, bannery, formularze, liczniki, ksiΩgi go╢ci, linki, fora, pliki i operacje na nich, statystyki, wyszukiwarki, rankingi, darmowe skrypty, Jakub Filipowski, Jan Filipowski, katalog, Katalog stron zwi▒zanych z tematyk▒ webmasterstwa, webmasterswo, magazyn www, style, CSS, XML, ASP, jΩzyki skryptowe, generatory, anarchizm">
  13. </head>
  14. <body>
  15.  
  16.  
  17. <div align="left">
  18. <table border="0" cellpadding="0" cellspacing="0" width="770">
  19. <tr>
  20. <td width="770" valign="top" colspan="3">
  21.  
  22.     <table border="0" cellpadding="0" cellspacing="0" width="770">
  23.     <tr>
  24.     <td width="166" valign="top"><a href="index.php"><img src="img/logo.gif" border="0" width="166" height="70" alt="WEB-AREA.org - serwis webmaster≤w"></a></td>
  25.     <td width="604" height="70" background="img/gora.gif" align="right"><iframe src="banner.php" MARGINWIDTH="0" MARGINHEIGHT="0" HSPACE="0" VSPACE="0" FRAMEBORDER="0" SCROLLING="NO" WIDTH="468" HEIGHT="60">
  26. </iframe></td>
  27.     </tr></table>
  28.  
  29. </td>
  30. </tr><tr>
  31. <td width="770" valign="top" colspan="3">
  32.     <table border="0" cellpadding="1" cellspacing="0" width="770">
  33.         <tr><form method="post" action="szukaj.php">
  34.         <td width="260">    <input type="text" name="zapytanie" size="15"> <input type="submit" value="SZUKAJ"> <span class="m"><a href="index.php@url=redakcja_2Fszukaj">Jak szukaµ?</a></span></td></form>
  35.         <td width="510">
  36.         
  37.         <p align="center">
  38.         <a href="index.php@id=206" class="gora">Konkurs</a>   
  39.         <a href="subskrypcja/nowa.php" class="gora">Za│≤┐ subskrypcjΩ</a>    
  40.         <a href="index.php@id=128" class="gora">Katalog</a>    
  41.         <a href="forum.php" class="gora">Forum</a>    
  42.         <a href="index.php@id=15" class="gora">BeginnerZone</a>
  43.         
  44.         </td>
  45.     </tr></table>
  46. </td>
  47. </tr>
  48. <tr>
  49. <td width="142" valign="top">
  50.     
  51.     <br>
  52.     <table border="0" cellpadding="0" cellspacing="0" width="142">
  53.     <tr>
  54.     <td width="142" valign="top"><img src="img/menu.gif" border="0" width="142" height="13" alt="MENU"></td>
  55.     </tr>
  56.     <tr>
  57.     <td width="142" valign="top" background="img/okno1.gif">
  58.     <img src="img/s.gif" width="9" height="8"><b class="menu1">KURSY</b><br>
  59.       - <a href="index.php@id=50" class="menu">HTML</a><br>
  60.       - <a href="index.php@id=40" class="menu">CSS</a><br>
  61.       - <a href="index.php@id=62" class="menu">Java</a><br>
  62.       - <a href="index.php@id=145" class="menu">PHP</a><br>
  63.       - <a href="index.php@id=39" class="menu">CGI</a><br>
  64.       - <a href="index.php@id=5" class="menu">ASP</a><br>
  65.       - <a href="index.php@id=182" class="menu">WML</a><br>
  66.       - <a href="index.php@id=190" class="menu">XML</a><br>
  67.       - <a href="index.php@id=159" class="menu">SGML</a><br>
  68.  
  69.     <img src="img/s.gif" width="9" height="8"><b class="menu1">SKRYPTY</b><br>
  70.       - <a href="index.php@id=78" class="menu">JavaScript</a><br>
  71.       - <a href="index.php@id=135" class="menu">PHP</a><br>
  72.       - <a href="index.php@id=30" class="menu">CGI</a><br>
  73.  
  74.     <img src="img/s.gif" width="9" height="8"><b class="menu1">INNE</b><br>
  75.       - <a href="index.php@id=59" class="menu">Szablony</a><br>
  76.       - <a href="forum.php" class="menu">Forum</a><br>
  77.       - <a href="index.php@id=61" class="menu">Webmasterska lista</a><br>
  78.       - <a href="index.php@id=128" class="menu">Katalog</a><br>
  79.       - <a href="index.php@id=15" class="menu">BeginnerZone</a><br>
  80.       - <a href="index.php@id=206" class="menu">Konkurs</a><br>
  81.     
  82.     <img src="img/s.gif" width="9" height="8"><b class="menu1">SUBSKRYPCJA</b><br>
  83.       - <a href="subskrypcja/nowa.php" class="menu">Za│≤┐</a><br>
  84.       - <a href="subskrypcja/admin.php" class="menu">Administracja</a><br>
  85.  
  86.     <img src="img/s.gif" width="9" height="8"><b class="menu1">REDAKCJA</b><br>
  87.       - <a href="index.php@id=156" class="menu">Sk│ad</a><br>
  88.       - <a href="index.php@id=157" class="menu">Wsp≤│praca</a><br>
  89.       - <a href="index.php@id=158" class="menu">Reklama</a></td>
  90.     </tr>
  91.     <tr>
  92.     <td width="142" valign="top"><img src="img/okno2.gif" border="0" width="142" height="10"></td>
  93.     </tr></table>
  94.  
  95. </td>
  96. <td width="486" valign="top"><br>
  97.     <div align="center">
  98.     <table border="0" cellpadding="0" cellspacing="0" width="460">
  99.     <tr>
  100.     <td width="460" valign="top"><table border="0" cellpadding="0" cellspacing="0" width="460">
  101.         <tr>
  102.         <td width="460" valign="top"><img src="img/zobacz.gif" border="0" width="460" height="13" alt="ZOBACZ JESZCZE"></td>
  103.         </tr>
  104.         <tr>
  105.         <td width="460" valign="top" background="img/okno11.gif"><div align="center">
  106.                 <table border="0" cellpadding="0" cellspacing="0" width="450"><tr><td width="450"><a class="menu" href="index.php@id=63">Wpowadzenie</a> 
  107.  <a class="menu" href="index.php@id=64">Historia jΩzyka Java</a> 
  108.  <a class="menu" href="index.php@id=65">Podstawowe informacje</a> 
  109.  <a class="menu" href="index.php@id=66">Typy podstawowe</a> 
  110.  <a class="menu" href="index.php@id=67">Operatory i ich priorytety</a> 
  111.  <a class="menu" href="index.php@id=68">S│owa kluczowe Javy</a> 
  112.  <a class="menu" href="index.php@id=69">Instrukcje steruj▒ce wykonywaniem programu</a> 
  113.  <a class="menu" href="index.php@id=70">Klasy</a> 
  114.  <a class="menu" href="index.php@id=71">Metody i pola</a> 
  115.  <a class="menu" href="index.php@id=72">Dziedziczenie klas</a> 
  116.  <a class="menu" href="index.php@id=73">Interfejsy</a> 
  117.  <a class="menu" href="index.php@id=74">Pakiety</a> 
  118.  <a class="menu" href="index.php@id=75">Wyj▒tki</a> 
  119.  <a class="menu" href="index.php@id=77">Funkcje specjalne</a> </td></tr></table></div></td>
  120.         </tr>
  121.         <tr>
  122.         <td width="460" valign="top"><img src="img/okno21.gif" border="0" width="460" height="10"></td>
  123.         </tr></table><span class="nag">Kurs Javy</span><br>
  124. Programy pisane za pomoc▒ jΩzyk≤w C czy Pascal, sk│adaj▒ siΩ og≤lnie m≤wi▒c z pojedynczego, g│≤wnego modu│u 
  125. wykonywanego linia po linii. Java podobnie jak inne nowoczesne systemy operacyjne obs│uguje 
  126. wielozadaniowosµ (w przypadku Javy chodzi o wilow▒tkowosµ, multithreading), czyli mo┐liwosµ jednoczesnego 
  127. uruchamiania oddzielnych modu│≤w programu oraz ich dalszego r≤wnoleg│ego dzia│ania.</p>
  128. <p>Klasyczny, jednow▒tkowy program wykonywany jest przez procesor w spos≤b liniowy - instrukcja po insrukcji. W 
  129. przypadku wyst▒pienia w nim operacji, kt≤re z r≤┐nych przyczyn przebigaj▒ relatywnie wolno (na przyk│ad proces 
  130. drukowania rysunku, oczekiwanie na podanie przez u┐ytkownika jakis danych), korzystniej by │oby gdyby zosta│y 
  131. one przesuniΩte na dalszy plan (by│y wykonywane w tle). W tym czasie procesor zaj▒│by siΩ innymi, nie cierpi▒cymi 
  132. zw│oki zadaniami (jak na przyk│ad wykonywaniem oblicze± czy odswierzaniem ekranu).</p>
  133. <p>Najlepszym wyjsciem by│oby jednoczesne wykonywanie dw≤ch zcy nawet wiΩcecej modu│≤w programu (w▒tk≤w). 
  134. Jeden z nich m≤g│by na przyk│ad przej▒µ zadanie drukowania, podczas gdy inny by│by odpowiedzialny za 
  135. przyjmowanie od u┐ytkownika danych, a kolejny za wykonywanie odpowiednich oblicze±. Co prawda w zasadzie 
  136. taka r≤wnoleg│osµ dzia│a± jest mo┐liwa do uzyskania bez "wielozadaniowosci", jednak osi▒gniΩcie tego efektu 
  137. kosztuje dosµ du┐o pracy. Wielow▒tkowosµ jest jedn▒ z cech Javy dlatego wiele problem≤w zwi▒zanych z tym 
  138. zagadnieniem przestaje istnieµ.</p>
  139. <p>Mo┐liwosµ r≤wnoleg│ego uruchamiania kilku w▒tk≤w nie oznacza jednak jeszcze, ┐e system wyposa┐ony tylko w 
  140. jeden procesor rzeczywiscie bΩdzie w stanie wykonywaµ wiΩcej ni┐ jedno dzia│anie jednoczesnie. De facto chodzi 
  141. jedynie o wykonywanie kilku linijek kodu danego w▒tku. Tak zwany scheduling (prze│▒czanie zada±) 
  142. odpowiedzialny jest za przydzielanie ka┐demu w▒tkowi odpowiedniej ilosci czasu obliczeniowego procesora, tak 
  143. by sprawiaµ wra┐enie rownoleg│osci wykonywania.</p>
  144. <p>Ponadto poszczeg≤lnym w▒tkom mog▒ byµ przypisane r≤┐ne priorytety, kt≤re decyduj▒ o kolejnosci przydzielania 
  145. im czasu obliczeniowego. S│u┐y do tego funkcja "setPriority()", kt≤rej parametr musi miesciµ siΩ w przedziale od 
  146. MIN_PRIORITY do MAX_PRIORITY. Im mniejsza jest jego wartosµ, tym d│u┐ej w▒tek bΩdzie czeka│na swoj▒ kolej. 
  147. W▒tki o takim samym priorytecie obs│ugiwane bΩd▒ jΩdnoczenie.</p>
  148. <p>Istniej▒ dwie mo┐liwosci tworzenia w▒tk≤w. Po pierwsze poprzez utworzenie klasy pochodnej zawieraj▒cej kod 
  149. w▒tku od klasy "Thread". W poni┐szym przyk│adzie gry w kosci utworzone zosta│y dwa typy w▒tk≤w . "WatekGracza" 
  150. obrazuje zachowanie graczy i "CzasGry" odpowiedzialny za odmierzanie czasu trwania gry - z ka┐d▒ sekund▒ 
  151. bΩdzie zwiΩksza│ odpowiedni licznik. Klasa "Gra" zawiera procedurΩ "main()". W pierwszej kolejnosci utworzone 
  152. zostan▒ one uaktywnione (wywolania: "Tomasz.start()" oraz "Jerzy.start()"). Po up│ywie dziesiΩciu sekund, gra 
  153. zostanie zako±czona, a otrzymany rezultatpoddany ocenie.</p>
  154. <pre>public class Gra
  155.   {
  156.    static boolean GraAktywna=true;
  157.    
  158.    public static void main(String args[])
  159.      {
  160.       // tworzenie w▒tk≤w (-> stan gry "New" ...)
  161.       WatekGracza Tomasz=new WatekGracza("Tomasz");
  162.       WatekGracza Jerzy=new WatekGracza("Jerzy");
  163.       //... uruchomienie w▒tk≤w (-> stan gry "Runnable")
  164.       Tomasz.start();
  165.       Jerzy.start();
  166.       // uruchomienie zegara odmierzaj▒cego czas trwania gry
  167.       new CzasGry().start();
  168.       while (CzasGry.Sekundy < 10)
  169.         {// gra zako±czona
  170.          GraAktywna=false;
  171.         }
  172.       // podanie wyniku
  173.       System.out.println("Punkty uzyskane przez Tomasza: "+Tomasz.Punkty+" / Jerzego: "+Jerzy.Punkty);
  174.       if (Tomasz.Punkty > Jerzy.Punkty)
  175.         System.out.println("Wygra│ Tomasz");
  176.       else
  177.         System.out.println("Wygra│ Jerzy");
  178.      }
  179.   }
  180. class WatekGracza extends Thread
  181.   {
  182.    // liczba punkt≤w osi▒gniΩtych przez gracza
  183.    public int Punkty;
  184.    // konstruktor w▒tku
  185.    public WatekGracza (String ImieGracza)
  186.      {
  187.       // konstruktor klasy bazowej wywo│ywany jest przez nazwΩ w▒tku
  188.       super(ImieGracza);
  189.      }
  190.    public void run()
  191.      {
  192.       int Rzut;  // wynik rzutu
  193.       while (Gra.GraAktywna)
  194.         {
  195.          // rzut ko╢µmi
  196.          Rzut=(int)(Math.random()*6); // funkcja random z pakietu java.util
  197.          // zwiΩkszenie liczby punkt≤w o uzyskany wynik rzutu
  198.          Punkty+=Rzut;
  199.          // podanie wyniku rzutu
  200.          System.out.println(getName()+" wyrzuci│ "+Rzut+"oczek - liczba punkt≤w"+Punkty);
  201.          
  202.          // im gorszy wynik rzutu, tym d│u┐ej gracz musi czekaµ na swoj▒ kolej
  203.          // (jeden gracz mo┐e rzucaµ kilakrotnie pod rz▒d)
  204.          try
  205.            {
  206.             sleep ((long)(6-Rzut)*100);
  207.            }
  208.          catch (InterruptedException e)
  209.            {
  210.             // wyj▒tek ten zostanie usuniΩty kiedy bie┐▒cy potok zostanie przerwany przez inny.
  211.             // Niniejsza instrukcja catch musi tu zostaµ zaimplementowana,
  212.             // w przeciwnym razie kompilator zg│osi komunikat o b│Ωdzie. 
  213.             System.out.println("Wyj▒tek");
  214.            }
  215.         }
  216.      }
  217.   }
  218. class CzasGry extends Thread
  219.   {
  220.    static int Sekundy=0;
  221.    
  222.    public void run()
  223.      {
  224.       while (Gra.GraAktywna)
  225.         {
  226.          try {sleep(1000);}
  227.          catch (InterruptedException e) {}
  228.          Sekundy+=1;
  229.         }
  230.      }
  231.   }</pre>
  232. <p>Metoda "run()" klasy "WatekGracza" opisuje w│a╢ciw▒ czΩ╢µ gry: Ka┐dy z graczy mo┐e rzucaµ koscmi. osi▒gniΩta 
  233. liczba oczek dodawana jest do og≤lnej liczby pukt≤w danego gracza. Im jest wy┐sza, tym kr≤cej dany w▒tek 
  234. znajduje siΩ w stanie "uspienia" (instrukcja "sleep()" umo┐liwia ustawiene potoku w stan bezczynnosci na 
  235. okreslony, podawany w milisekundach czas). W przypadku uzyskania "6" gracz mo┐e natychmiast rzucaµ dalej. Po 
  236. dziesiΩciu sekundach sΩdzia (funkcja "main()") konczy grΩ (ustawiaj▒c "GraAktywna = false"). Jesli utworzonych 
  237. zosta│o kilku graczy, graj▒ oni przeciwko sobie. poniewa┐ zale┐nie od uzyskiwanej liczby oczek wzajemnie 
  238. przenosz▒ siΩ oni w stan uspienia, ka┐dy z nich, zale┐nie od uzyskiwanych rezultat≤w mo┐e rzucaµ kilka razy pod 
  239. rz▒d. Za ka┐dym razem podawana jest liczba uzyskiwanych przez gracza oczek oraz og≤lna liczba zdobytych przez 
  240. niegodo tej pory punkt≤w. U┐ycie funkcji "sleep()" wymusza stworzenie metody obs│ugi wyj▒tku 
  241. "InterruptedException", poniewa┐ nie jest to wyj▒tek typu runtime-exception i jesli nie zostanie przechwycony 
  242. interpreter Javy przerwie wykonanie programu w momencie, w kt≤rym siΩ on pojawi. Wyj▒tek ten wystΩpuje w 
  243. chwili, gdy jeden w▒tekjest zatrzymywany, a uaktywniany inny (prze│▒czanie zada±).</p>
  244. <p>Identyfikacja gracza odbywa siΩ za posrednictwem nazwy odpowiadaj▒cego mu w▒tku. Konstruktor klasy 
  245. "WatekGracza" otrzymuje tΩ nazwΩ jako parametr. Za posrednictwem wywo│ania "super()" przewkazuje j▒ dalej, do 
  246. konstruktora klasy bazowej. Z kolei "getName()" podaje nazwΩ potoku, kt≤ry jest aktualnie aktywny.</p>
  247. <p>Druga mo┐liwosµ polega na utworzeniu klasy w▒tku implementuj▒cej interfejs "Runnable". Ka┐da klasa, kt≤ra 
  248. implementuje ten interfejs musi implementowaµ w│asn▒ metodΩ "run()". W celu uruchomienia takiego w▒tku nale┐y 
  249. wiΩc najpierw stworzyµ obiekt tej klasy, a potem utworzyµ w▒tek (obiekt klasy "Thread"). Konstruktor klasy 
  250. "Thread", kt≤remu nale┐y przekazaµ nasz obiekt i staje sie on odpowiedzialny za przeprowadzenie wszelkich 
  251. koniecznych inicjalizacji. Na koniec w celu uruchomienia w▒tku nale┐y wywo│aµ metodΩ "start()". Definicja 
  252. przyk│adowego w▒tku mo┐e wiΩc wygl▒daµ nastΩpuj▒co:</p>
  253. <pre>class DemoThread implements Runnable
  254.   {
  255.    public void run() // zadaniem w▒tku jest odliczenie od 1 do 10
  256.      {
  257.       int i;
  258.       for (i=0; i<10;></pre>
  259. Opr≤cz metody "run()" w interfejsie "Runnable" istniej▒
  260. jeszcze inne -"init()", "start()" czy "stop()",
  261. kt≤re mog▒ mieµ istotne znaczenie dla uruchomienia b▒d╝ zako±czenia w▒tku.
  262. Jak widaµ w podanym przyk│adzie w▒tek nie musi ich implementowaµ - wystarczy
  263. wywo│aµ odpowiedni▒ metodΩ klasy bazowej. Metoda "init()" przeprowadza
  264. wszystkie konieczne do uruchomienia w▒tku inicjalizacje (na przyk│ad: otwarcia
  265. okna, za│adowanie fontu, przypisanie priorytetu itd.). wywo│anie metody
  266. "start()" uruchamia w▒tek, a "stop()"zatrzymuje go.
  267. Zale┐nie od tego, czy w▒tek zosta│ w│asnie stworzony, czy jest aktywny,
  268. zatrzymany, czy te┐ zako±czony mo┐emy rozr≤┐niµ kilka nastΩpuj▒cych stan≤w:
  269. <table border="0" width="100%">
  270. <tr>
  271. <td width="10%" valign="top">New</td>
  272. <td valign="top">W▒tek, ewentualnie obiekt jest tworzony za pomoc▒ operatora "new",
  273. ale nie oznacza to jego natychmiastowego uruchomienia (stan przed wywo│aniem
  274. metody "start()"). W tym stanie w▒tek nie zu┐ywa jeszcze ┐adnnych
  275. zasob≤w systemu.</td>
  276. </tr><tr>
  277. <td valign="top">Runnable</td>
  278. <td valign="top">Wywo│anie metody "start()" w▒tku nie oznacza jeszcze, ┐e
  279. wykonuje siΩ on ci▒gle. Jesli (na przyk│ad) w tym samym czasie aktywny
  280. jest jakis inny w▒tek, to inne przechodz▒ do stanu "Runnable".
  281. W ka┐dym momencie mo┐e on zostaµ uaktywniony.</td>
  282. </tr><tr>
  283. <td valign="top">Running</td>
  284. <td valign="top">W▒tek jest wykonywany (otrzyma│ czas obliczeniowy procesora).</td>
  285. </tr><tr>
  286. <td valign="top">Not Runnable</td>
  287. <td valign="top">Wátym stanie dany w▒tek nie mo┐e zostaµ wystartowany. W praktyce oznacza
  288. to, ┐e albo oczekuje na wykonanie jakiejs wolnej operacji wejscia/wyjscia
  289. (na przyklad na podanie przez u┐ytkownika danych z klawiatury) albo te┐
  290. zosta│ przeniesiony w ten stan za pomoc▒ odpowiednich metod: "suspend()",
  291. "sleep()" lub "wait()". W▒tek znajduj▒cy siΩ w tym
  292. stanie mo┐e zostaµ przeniesiony do stanu "Runnable" w monencie
  293. zako±czenia wstrsymuj▒cej go operacji wejscia/wyjscia, lub te┐ po wywo│aniu
  294. metody "notify()" lub "notifyAll()" (jesli zostra│
  295. wstrzymany przez "suspend()", "resume()" lub "wait()").</td>
  296. </tr><tr>
  297. <td valign="top">Dead</td>
  298. <td valign="top">W▒tek mo┐e zostaµ zatrzymany za pomoc▒ metody "stop()". Po
  299. takiej operacji w▒tek formalnie mo┐e jeszcze istnieµ, o ile tylko obiekt
  300. klasy Thread jest jeszcze aktywny. Z tego stanu w▒tek nie mo┐e byµ ju┐
  301. wystartowany - jest wiΩc "martwy" ("dead"). W stan
  302. ten w▒tek zostaje tak┐e przeniesiony po normalnym jego wykonaniu, a nastΩpnie
  303. zako±czeniu.</pre></td>
  304. </tr></table>
  305. <p>Tworzenie program≤w wsp≤lbie┐nych, jednoczesnie korzystaj▒cych z zasob≤w systemowych, konkuruj▒cych o 
  306. dostΩp do urz▒dze± zewnΩtrznych moze powodowaµ wiele nieoczekiwanych i trudnych do rozwi▒zania problem≤w. 
  307. Pierwszy z nich pojawia siΩ ju┐ w momencie, kiedy kilka r≤wnolegle wykonywanych w▒tk≤w zechce u┐yµ tych 
  308. samych p≤l danych. Wykonywaine watk≤w jest cyklicznie przerywane, ale w nieustalonych i nier≤wnych odstΩpach 
  309. czasu. Nie wolno zatem z g≤ry zak│adaµ, ┐e jakis inny w▒tek nie bΩdzie wykonywany r≤wnolegle z naszym i ┐e w 
  310. czasie potrzebnym do wykonania fragmentu w▒tku inny nie zmodyfikuje jakichs wsp≤│dzielonych danych. Problem 
  311. ten mo┐e przybli┐yµprzedstawiony poni┐ej przyk│ad: Klasa "PutGetClass" zajmuje siΩ zarz▒dzaniem 
  312. wsp≤│dzielonego przez dwa w▒tki bufora. Licznik o nazwie "counter" podaje kolejn▒ woln▒ pozycjΩ w buforze. 
  313. Metoda "Put()" umieszcza na wskazywanej przez licznik pozycji jego obecn▒ wartosµ i zwiΩksza licznik o jeden. Za 
  314. pomoc▒ metody "Get()" nastΩpuje odczytanie wskazywanej przez licznik pozycji bufora, a on sam jest nastΩpnie 
  315. pomniejszany o jeden. Tak w│asnie chcielibysmy, aby zachowywa│a siΩ ta klasa. jesli jednak za pomoc▒ metody 
  316. "Put()" zostanie wykonany zapis wartosci do bufora, ale scheduler (proces zarz▒dzaj▒cy zadaniami) prze│▒czy 
  317. nastΩpnie zadania, to stan licznika pozostanie niezmieniony. ZwiΩkszy siΩ o 1 dopiero w chwili, gdy procesor 
  318. zacznie ponownie wykonywaµ w▒tek. Jesli metoda "Put()" umieszczaµ bΩdzie w buforze zamiast wartosci licznika 
  319. przekazywany argument, to klasa ta bΩdzie odpowiadaµ normalnej pamiΩci FIFO. Jednak┐e zapisywanie stanu 
  320. licznika wydatnie pomaga w zobrazowaniu b│Ωd≤w prrzyporz▒dkowania. Klasa "PutGetUser" definiuje w▒tki, 
  321. korzystaj▒ce intensywnie z operacji zapisu ("Put()") oraz odczytu ("Get()") do bufora. PΩtla "for" ma za zadanie 
  322. symulacjΩ wykonywania w miΩdzyczasie innego, kr≤tkiego programu. </p>
  323. <pre>class PutGetClass
  324.   {
  325.    static int counter = 0;
  326.    static int buffer[] = new int[32];
  327.    static synchronized void Put()
  328.    // static void Put()
  329.      {
  330.       buffer[counter] = counter;
  331.       ++counter;
  332.      }
  333.    static synchronized int Get()
  334.    // static int Get()
  335.      {
  336.       --counter;
  337.       if (buffer[counter] != counter)
  338.         System.out.println("B│▒d przypisania !! "+buffer[counter]+" "+counter);
  339.       return (buffer[counter]);
  340.      }
  341.   }
  342. class PutGetUser extends Thread
  343.   {
  344.    public void run()
  345.      {
  346.       while (true)
  347.         {
  348.          PutGetClass.Put();
  349.          int i;
  350.          for (i=0; i<10;></pre>
  351. <p>Jesli klasa "PutGetClass" zostanie zostanie wykorzystana w programie jednow▒towym, wszystko bΩdzie przebiega│o 
  352. zgodnie z oczekiwaniami na ekranie nie pojawi siΩ nic niespodziewanego. Jednak w programie wielow▒tkowym po 
  353. jakims czasie ujrzelibymy seriΩ komunikat≤w o blΩdach. Rozwi▒zaniem powsta│ego problemu jest "synchronizacja". 
  354. W momencie wywo│ania krytycznej metody i uruchomienia procedur, jakie ona zawiera, niedozwolone jest 
  355. prze│▒czanie na inny w▒tek, kt≤ry nawet przypadkowo mia│by j▒ r≤wnie┐ wywo│aµ. Java wyposarzona jest w 
  356. mechanizm, kt≤ry w bardzo dok│▒dny spos≤b sytuacjΩ tak▒ potrafi rozpoznaµ. Z tego wzglΩdu wszystkie metody, 
  357. kt≤re stanowi▒ podobne zagro┐enie, Poprzedzone zostaj▒ s│owem kluczowym "synchronized". Je┐eli teraz 
  358. wspomniana metoda zostanie wywo│ana przez kt≤rys z w▒tk≤w, jest automatycznie zablokowana dla innych w▒tk≤w. 
  359. ostΩp do niej odblokowywany jest dopiero w momencie, kiedy poprzedni w▒tek przestaje z niej korzystaµ. Je┐eli w 
  360. czasie, kiedy dana metoda zablokowana jest przez jeden w▒tek, a jakis inny spr≤buje j▒ wywo│aµ, to zostaje 
  361. przeniesiony w stan oczekiwania - do czasu zwolnienia dostΩpu do potrzebnej metody. Zarz▒dzaniem blokowania i 
  362. zwalniania dostΩpu do metod zajmuj▒ siΩ tzw. "monitory". W powy┐szym przyk│adzie obie metody: "Get()" oraz 
  363. "Put()" powinny byµ zadeklarowane jako synchronizowane. Oczywistym jest chyba fakt, ┐e opisane powy┐ej 
  364. problemy bΩd▒ wystΩpowaµ raczej rzadko.B│Ωdy tego typu s▒ te┐ dosµ trudne do zlokalizowania. W przypadku 
  365. wsp≤lnych obszar≤w danych, u┐ywanych przez wiΩcej niz tylko jeden w▒tek, powinno siΩ wiΩc postΩpowaµ dosµ 
  366. ostro┐nie (tzn. definiowaµ jako "synchronized" wszystkie metody, kt≤re mog▒ siΩ znale╝µ w opisanej powy┐ej 
  367. sytuacji) lub unikaµ ich - w miarΩ mo┐liwosci. Synchronizacja nie jest niestety srodkiem doskona│ym - kryje ona w 
  368. sobie niebezpiecze±stwo wzajemnego blokowania metod. Jesli jeden w▒tek zablokuje metodΩ (nazwijmy j▒ A), a 
  369. wykonywany wsp≤│bierznie w▒tek inn▒ (o nazwie B), to jesli metoda B (w danej chwili zablokowana) wywo│ywana 
  370. jest przez metodΩ A, a jesli jednoczesnie metoda A pr≤buje wywo│aµ B, to dochodzi to tzw. zakleszczenia. W takiej 
  371. sytuacji bowiem oba w▒tki czekaj▒ na siebie nawzajem, czyli na zako±czenie korzystania z danej metody przez 
  372. "swojego przeciwnika". Poniewa┐ jednak nie dojdzie do tego nigdy (zako±czenie metody A wymaga wykonania 
  373. zablokowanej metody B, a odblokowanie B warunkowane jest wczesniejszym zako±czeniem A), program wpada w 
  374. sytuacjΩ bez wyjscia, okreslanej z angielska jako "deadlock". Praktycznie istnieje tylko jedna mo┐liwosµ 
  375. powstawania tego typu sytuacji: nale┐y unikaµ jak ognia definiowania metod jako "synchronized", korzystaj▒cych z 
  376. innych tego typu metod. Stosowanie metod "synchronized" jest de facto wykroczeniem przeciwko 
  377. wielozadaniowosci - silnie faworyzuje wykonuj▒cy tak▒ metodΩ w▒tek. Rozs▒dne ograniczenie definiowania metod 
  378. synchronizowanych do niezbΩdnego minimum pozwala unikn▒µ faworyzowania kt≤regos z w▒tk≤w i ustrzec siΩ 
  379. przed niebezpiecze±stwem zakleszcze±. Dlatego te┐ nie powinny byµ implementowane jako "synchronized"na 
  380. przyk│ad obliczenia, kt≤re zajmuj▒ wiele czasu. Ponadto z w▒tk≤w powinno siΩ robiµ u┐ytek jedynie w≤wczas, kiedy 
  381. faktycznie konieczne jest zastosowanie r≤wnoleg│ego wykonywania kodu programu. Sytuacja ma miejsce jedynie 
  382. w≤wczas, gdy ka┐dy w▒tek ma do wykonania scisle okreslone zadanie -w≤wczas z regu│y nie wystΩpuje tez i ich 
  383. wzajemna zale┐nosµ. </p>
  384. <br></td>
  385.     </tr></table>
  386.     </div>
  387. </td>
  388. <td width="142" valign="top">
  389.  
  390.         <br>
  391.         <table border="0" cellpadding="0" cellspacing="0" width="142">
  392.         <tr>
  393.         <td width="142" valign="top"><img src="img/login.gif" border="0" width="142" height="13" alt="LOGIN"></td>
  394.         </tr>
  395.         <tr>
  396.         <td width="142" valign="top" background="img/okno1.gif">
  397.         
  398.             
  399.             <div align="center">
  400.             <table cellpadding="0" cellspacing="2" border="0" width="98%">
  401.             <form method="post" action="subskrypcja/login.php">
  402.             <tr><td width="30%"><span class="t">Login:</span></td><td width="68%"><input type="text" name="login" size="15" class="login"></td></tr>
  403.             <tr><td width="30%"><span class="t">Has│o:</span></td><td width="68%"><input type="password" name="haslo" size="15" class="login"></td></tr>
  404.             
  405.             <tr><td colspan="2"><center><input type="image" src="img/ok.gif"></td></tr>
  406.             </form></table></div>
  407.         
  408.         </td>
  409.         </tr>
  410.         <tr>
  411.         <td width="142" valign="top"><img src="img/okno2.gif" border="0" width="142" height="10"></td>
  412.         </tr></table>
  413.  
  414.         <br>
  415.         <table border="0" cellpadding="0" cellspacing="0" width="142">
  416.         <tr>
  417.         <td width="142" valign="top"><img src="img/art.gif" border="0" width="142" height="13" alt="ARTYKULY"></td>
  418.         </tr>
  419.         <tr>
  420.         <td width="142" valign="top" background="img/okno1.gif">
  421.         
  422.         <span class="m">
  423.         
  424.          -<a href="index.php@id=1" class="menu">"Edytory HTML'a"</a><br>
  425.          -<a href="index.php@id=2" class="menu">"Publikowanie witryny"</a><br>
  426.          -<a href="index.php@id=3" class="menu">"PHP w domu"</a><br>
  427.          -<a href="index.php@id=4" class="menu">"Przeszukiwanie stron"</a><br>
  428.          -<a href="index.php@id=204" class="menu">"Wprowadzenie do Javy"</a><br>
  429.          -<a href="index.php@id=210" class="menu">"Grafika w PHP"</a>
  430.         </span>
  431.         
  432.         </td>
  433.         </tr>
  434.         <tr>
  435.         <td width="142" valign="top"><img src="img/okno2.gif" border="0" width="142" height="10"></td>
  436.         </tr></table>
  437.         
  438.         <br>
  439.         <table border="0" cellpadding="0" cellspacing="0" width="142">
  440.         <tr>
  441.         <td width="142" valign="top"><img src="img/stat.gif" border="0" width="142" height="13" alt="ARTYKULY"></td>
  442.         </tr>
  443.         <tr>
  444.         <td width="142" valign="top" background="img/okno1.gif"><div align="left"><table border="0" cellpadding="0" cellspacing="0" width="138"><tr><td width="138"><ol><li><a href="index.php@id=135" class="stat">PHP - przyk│adowe skrypty</a> <span class="maleczarne">(1491)</span><br><li><a href="index.php@id=59" class="stat">Szablony 1</a> <span class="maleczarne">(833)</span><br><li><a href="index.php@id=145" class="stat">Kurs PHP</a> <span class="maleczarne">(817)</span><br><br><span class="maleczarne">ú▒cznie: 24158</span>        </ol>
  445.         <center><a href="http://stat.webmedia.pl/cgi-bin/anal?webarea" target="_blank">
  446. <img border=0 src="http://stat.webmedia.pl/cgi-bin/stat?webarea&stat4ur" alt="stat4u" width="40" height="10"></a></center>
  447.         </td></tr></table></div>
  448.         </td>
  449.         </tr>
  450.         <tr>
  451.         <td width="142" valign="top"><img src="img/okno2.gif" border="0" width="142" height="10"></td>
  452.         </tr></table>
  453.         
  454.         <br>
  455.         <table border="0" cellpadding="0" cellspacing="0" width="142">
  456.         <tr>
  457.         <td width="142" valign="top"><img src="img/sponsor.gif" border="0" width="142" height="13" alt="SPONSOR"></td>
  458.         </tr>
  459.         <tr>
  460.         <td width="142" valign="top" background="img/okno1.gif"><br>
  461.         <center><EMBED src="img/beep2.swf" quality=high bgcolor=#000000 WIDTH=120 HEIGHT=30></center>                            
  462.         </td>
  463.         </tr>
  464.         <tr>
  465.         <td width="142" valign="top"><img src="img/okno2.gif" border="0" width="142" height="10"></td>
  466.         </tr></table>
  467.  
  468.         <br>
  469.             <div align="center"><table border="0" cellpadding="2" cellspacing="0" width="120">
  470.             <tr>
  471.             <td width="120"><a href="button.php@id=1" target="_blank"><img src="img/cgi.gif" border="0"></a></td>
  472.             </tr>
  473.             <tr>
  474.             <td width="120"><a href="button.php@id=2" target="_blank"><img src="img/ygreg.gif" border="0"></a></td>
  475.             </tr>
  476.             <tr>
  477.             <td width="120"></td>
  478.             </tr>
  479.             </table>
  480.             </div>
  481.         
  482.  
  483. </td>
  484. </tr>
  485. <tr>
  486. <td width="770" valign="top" colspan="3" align="right"><br><br><span class="m">All rights reserved by <a href="mailto:web-area@web-area.org">J&J Filipowscy Design & Code</a></td>
  487. </tr></table></div>
  488.  
  489.  
  490. </body>
  491. </html>