Java - programování podprocesů (vláken) (Ukázka, strana 99)

Page 1

"VypisovačKočky: zámek píšeKočka obdržen"); System.out.println("Kočka leze dírou"); // ... while(!Program.píšePes.napsáno) { synchronized(Program.píšePes) { Program.žurnál.log(Level.INFO, "VypisovačKočky: žádám zámek píšePes"); Program.píšePes.wait(); Program.žurnál.log(Level.INFO, "VypisovačKočky: vracím zámek píšePes"); } } // ... Program.žurnál.log(Level.INFO, "VypisovačKočky: vracím zámek píšeKočka"); } } catch(InterruptedException iex){} }

Podobnou úpravu třídy VypisovačPsa jistě zvládnete sami. Po spuštění dostaneme výstup (pro stručnost vynecháme informace o čase výpisu): INFO: INFO: INFO: INFO: INFO: INFO:

VypisovačPsa: žádám zámek píšePes VypisovačKočky: žádám zámek píšeKočka VypisovačPsa: zámek píšePes obdržen VypisovačKočky: zámek píšeKočka obdržen VypisovačPsa: žádám zámek píšeKočka VypisovačKočky: žádám zámek píšePes

Je zřejmé, že skutečně došlo k uváznutí – program čeká na obsazené zámky, které nemohou být uvolněny. Ve skutečnosti jsme zde v podstatě přesně naprogramovali scénář popsaný ve 4. kapitole v příkladu 4.2: Dva podprocesy požadují dva stejné zámky, ovšem v opačném pořadí. Každý z nich dostane jeden a pak do nekonečna čeká na druhý. Všimněte si, že zde není možné pořadí zámků změnit. Je ale možné synchronizovat pouze vybrané příkazy a tím se požadavku dvou zámků vyhnout. Zdrojový kód tohoto příkladu v původní podobě a s výpisem najdete v souborech ke stažení v adresářích 05\03-uváznutí a 05\03-uváznutí-s-výpisem.

PŘÍKLAD 5.5 | STŘÍDÁNÍ ŘÁDEK PŘI VÝPISU ŘEŠENÍ ÚLOHY N DAM Jako složitější příklad komunikace podprocesů napíšeme program, který bude vypisovat všechna řešení úlohy n dam tak, že vypíše jedno řešení začínající na nulté řádce, pak jedno řešení začínající na první řádce atd. Po vyčerpání všech řádek začne zase od nulté – vypíše druhé řešení, které na ní začíná, pak vypíše druhé řešení začínající na první řádce atd., dokud nevypíše všechna řešení. Přitom pro výpis každé skupiny řešení začínajících na stejné řádce použijeme samostatný podproces a tyto podprocesy si budou navzájem předávat řízení. Připomeňme si, že třída Řešitel k tomu poskytuje nástroj v podobě metody najdiDalšíŘešení­ OdŘádky(), které zadáme číslo řádky, a ona nám vrátí logickou hodnotu říkající, zda se takové řešení podařilo najít; nalezené řešení pak vypíšeme pomocí metody výpis(). 98 Java – programování podprocesů (vláken)

Ukázka elektronické knihy, UID: KOS505707


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.