15.2.2016 Zkouška - Hnětynka

Předmět zaměřený na praktické programování v jazyku a prostředí Java
Protton

15.2.2016 Zkouška - Hnětynka

Příspěvek od Protton »

Tak dneska si na nás pošušňal, zadání bylo nehorší co jsem kdy viděl, ale udělat šlo. Jaká byla úspěšnost netuším, ale asi slušná.

Klasika 10 otázek, 2 na psaní kódu.

Otázky 1-6, 8 a 9 tady již byly, klasické vyber slova co do Javy nepatří, import static, synchronized getter a setter... přesné znění otázek i odpovědi najdete tady na fóru.

9 bylo klasické předefinování .equals pro class Complex, tam se musí dát pozor že equals bere Object a v implementaci musíte teprve zjistit, jestli je ten Object Complex nebo ne. Je to naimplementované někde tady ve vláknech se zkouškama.

Teď změny... a to bylo něco. Otázka 7: Měli jsme tam nadefinovaná 3 interface, přesně si je nepamatuji, byly funkcionální.

Ke každému pak byl příklad jeho použítí pomocí labda syntaxe, mělo se kroužkovat zda se to tak přeloží. Dvě byly dobře, první nevím proč, druhé bylo runnable co se vytvořilo jako () -> {} a třetí dávalo do funkce pro bool hodnotu int... Ani jedno nebylo dobře vidět, ani jedno nebylo jasné, ani jedno nebylo jasně ukázané v přednáškách. Snad si to někdo celé pamatuje a doplní to tady.

Pak byla 10. Oh boy... Máme funkci co jako argument dostává pole intů a vrací int. Naimplementujte vícevláknově (s ideálním počtem vláken) součet čísel v tomto poli.

Nejdřív to všem řešením společné (sám Hnětynka říkal, že se to dá řešit asi 100 způsoby) a to je jak získat ideální počet vláken, za to se rovnou strhával bod když to tam nebylo. Runtime.availableProcessors() vám vrátí intovou hodnotu říkající, kolik jader má virtual machine k dispozici. Tolik vláken potom chcete vytvořit.

Hnětynka pak vykládal o řešení na jeden řádek. Pole jde pomocí nějaké funkce z arrays předělat na stream, ten se dá rozdělit do více vláken jednodušše a je to. Jak přesně se to dělá netuším, ale očividně je to velice jednoduché a elegantní řešení.

Nám zbytku zbylo jen vytváření klasických vláken skrz dědění Thread nebo implementaci Runnable. Musí se dát pozor, že vlákno se startuje metodou start(), nestačí jen nadefinovat run().

Další možnost byl ForkJoinPool, kde musíte nadefinovat vlastní class myRecursiveTask extends RecursiveTask... ForkJoinPoolu se při vytváření (argument konstruktoru) dá říct, kolik má používat vláken. Vlastní výpočet pak provádí metoda v myRecursiveTask. Najděte si, jak se to používá, hodí se to.

Při opravování tototo byl docela hodný a pokud řešení vypadalo, že by mohlo nějak fungovat, a že chápete základ toho jak programovat vícevláknově, tak body nedával. Kdo ale neměl ideální počet vláken, nenastartoval je nebo to nějak více zvoral, ten pohořel. Řešení tedy nemuselo být ani zdaleka funční nebo kompletní, já jsem například nevěděl jak z ForkJoinPoolu dostat výsledek a ani řešení v myRecursiveTask nebylo kompletně implementované, stejně jsem dostal 0.
Odpovědět

Zpět na „PGR013 Java“