Prehľadávanie HTML dokumentov a Java

Xgamer8

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #15 kdy: 07. 01. 2012, 08:41:42 »
Ešte by som sa chcel spýtať, pozeral som na ten tvoj kod, snažil som sa ho pochopiť..:)  ale mam otazku, ako spraviť aby som mohol vykonať ešte niečo v maine po volaní metody start()? Lebo ak to dobre chápem tak main si prebehne spustia sa tie thready v triede Collector a potom main už len čaka na to dokedy sa dokončia, čiže v nom už nemožem nič spravit.  Ako by sa dal spravit nejaky test či už boli tie thready dokončene aby sa v maine mohlo ešte niečo vykonat?


jehovista

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #16 kdy: 07. 01. 2012, 14:19:39 »
To mas v te tride StatusWorker, ktera vypisuje kolik uz jsi nasel linku. Kdyz se ty vlakna co hledaji linky ukonci(while (runningWorkers > 0)while (runningWorkers > 0)), tak prestane vypisovat status a vypise ti nalezene linky a skonci.

Xgamer8

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #17 kdy: 07. 01. 2012, 16:21:02 »
Ano, ale to ukončí aj main, kedže dopehne aj StatusWorker, lenže ja by som potreboval ešte priamo v maine pracovať so ziskanými datami. Z tej analyzy vytvaram  mapu znakov ktora je premmenna triedy Collector, avšak potrebujem s nou pracovat priamo v maine, kedže to predavam dalšiemu objektu atd, teda v main metode by som potreboval kontrolovat stav threadov aby ked už dobehnut thready aby pokračoval v maine.

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #18 kdy: 07. 01. 2012, 18:10:06 »
Skús Thread.join().

Xgamer8

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #19 kdy: 08. 01. 2012, 09:23:03 »
Thread.join() nefunguje, zamrzne cela aplikacia, vyriešil som to pridanim riadku while (!executor.isTerminated()) {} do metody start() avšak mam ju upravenu do tejto podoby:

Kód: [Vybrat]
public void start(){
    ExecutorService executor = Executors.newFixedThreadPool(nThreads);
    CollectThread workers[] = new CollectThread[nThreads];
    for(int i = 0; i < nThreads; i++){
    workers[i]= new CollectThread();
    executor.execute(workers[i]);
    }
    executor.shutdown();
    while (!executor.isTerminated()) {}
Ak to dobre chápem tak sa z tej metody nevyskočí dovtedy pokial maju thready čo robiť. Avšak neviem či je to zrovna idealne riešenie ale funguje:)


Xgamer8

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #20 kdy: 08. 01. 2012, 09:31:04 »
No popravde jsem se spis zasek na tom, kolik zabavy si s tim uziju..
Jeste to podstatne vylepsuju(uz davam cca 500 linku za vterinu)

Nechcel by si sa podelit o to ako si to tak zrýchlil?:)

jehovista

Re:Prehľadávanie html dokumentov, ziskavanie odkazov, java
« Odpověď #21 kdy: 08. 01. 2012, 16:18:46 »
Experimentovanim jsem dostal ten kod do stavu, ktery bych nerad nekam posilal :)
Kazdopadne tam je porad hned nekolik brzd: ArrayBlockingQueue je v tomto pripade podle me hloupost, protoze se ti ta vlakna zasekavaji jenom kvuli tomu, ze nemuzou pridavat vysledky. Taky snadno nezajistis, abys nepridaval neco, co uz jsi pridal. Nejaky set bude lepsi, nebo aspon drzet vedle toho set, abyses moh ptat na existenci s logaritmickou slozitosti.
Pocet vlaken muzes dat podstatne vyssi, nez je pocet jader, protoze je stejne bude brzdit IO wait. Nejlip mi to beha tak pri cca 50 vlaknech. Problem je, ze najednou dostanes treba dvacet linku, ktere zkapou na timeout. Aby se ti nezaseklo hodne vlaken najednou, tak bud potrebujes vybitat linky nahodne, nebo pouzit nejake sofistikovanejsi metody(radit vysledky podle rychlosti nacteni toho, co prave zpracovavas). No bylo by toho asi dost, ale uz tim asi nechci travit dalsi cas  :-\

Xgamer8

Re:Prehľadávanie HTML dokumentov a Java
« Odpověď #22 kdy: 08. 01. 2012, 17:26:16 »
Jasne, aj tak veľmi pekne dakujem dosť si mi pomohol:)

hryzo

Re:Prehľadávanie HTML dokumentov a Java
« Odpověď #23 kdy: 08. 01. 2012, 22:42:49 »
Odo mna par postrehov, len co som letmo zbadal.

Davajte si pozor na counting thread workerov - myslim ze v Jave 6 by mali mat primitivne typu (okrem long a double) pristup do pamate ako atomicku operaciu. To ale neznamena, ze --- worker++ --- je atomicka operacia - tu si treba uvedomit,ze ++ sa sklada z troch operacii, ktore su sice kazda atomicka (load, add, store), ale spolu nie su atomicke a musia sa lockovat (alebo vymysliet nieco ine)

VOLATILE vam tak isto nezaruci uplnu atomickost bez side-effects, ktore sa mozu vyskytnut (preto sa pouziva napriklad iba pri boolean-och, kde potrebujete mat istotu,ze je to true a iny side-effect (nieco, cokolvek ine ako true) vam neprekaza --- preto sa volatile moc neodporuca pri ciselnych typoch, tam je bud konkretne cislo alebo nieco ide dost odlisny stav).



jehovista

Re:Prehľadávanie HTML dokumentov a Java
« Odpověď #24 kdy: 09. 01. 2012, 00:21:17 »
Odo mna par postrehov, len co som letmo zbadal.

Davajte si pozor na counting thread workerov - myslim ze v Jave 6 by mali mat primitivne typu (okrem long a double) pristup do pamate ako atomicku operaciu. To ale neznamena, ze --- worker++ --- je atomicka operacia - tu si treba uvedomit,ze ++ sa sklada z troch operacii, ktore su sice kazda atomicka (load, add, store), ale spolu nie su atomicke a musia sa lockovat (alebo vymysliet nieco ine)

VOLATILE vam tak isto nezaruci uplnu atomickost bez side-effects, ktore sa mozu vyskytnut (preto sa pouziva napriklad iba pri boolean-och, kde potrebujete mat istotu,ze je to true a iny side-effect (nieco, cokolvek ine ako true) vam neprekaza --- preto sa volatile moc neodporuca pri ciselnych typoch, tam je bud konkretne cislo alebo nieco ide dost odlisny stav).

S tim ++ mas pravdu. Dokonce jsem na to myslel, kdyz jsem to psal a pak jsem to nejak vypustil z hlavy :D Nejlepsi bude asi AtomicInteger. Jinak ja s vlakny nikdy pracovat nemusel(vyjma pripadu, kdy me k tomu nuti framework) a znalosti mam tedy jenom nactene, neproverene praxi. Tohle je jen na rychlo spichnuta funkcni implementace a urcite by se to dalo napsat mnohem lepe...