Paralleelarvutused
Koosta paralleelarvutusprogramm, mis loeb ja töötleb paralleelselt mitut sisendfaili. Programm saab käsurea parameetritega sisendfailide nimed (relative pathid). Sisendfaile võib olla väga palju (üle 100 000).
Sisendfailid on utf-8 tekstifailid, millest igaüks sisaldab väga väga palju täisarve. Failides võivad kõik arvud olla tühikutega eraldatuna ühel real, aga võivad olla ka mitme rea peale jaotatud. Igas failis on vähemalt üks arv. Failid ja ka üksikud read võivad olla nii suured, et need ei mahu korraga mälusse ära.
Arvud võivad olla suuremad, kui mahub long tüüpi muutujasse. Sellega hakkama saamiseks peab programm kasutama arvude hoidmiseks BigInteger klassi.
Programm peab failide töötlemiseks looma protsessorituumadega võrdse arvu threade (workerid). Loo üks ühine BlockingQueue, millest kõik workerid töötlemist vajavate failide nimesi võtavad. Loo teine ühine BlockingQueue, kuhu workerid iga faili kohta järgneva komplekti lisavad: töödeldud faili nimi, selle faili suurim üksik arv ja kõigi arvude summa.
Programmi lõppedes peab main threadist ekraanile väljastama:
- Kõikide leitud arvude kogusumma
- Kõige suurema leitud üksiku arvu väärtuse ja vastava faili nime
- Kõige väiksema arvude summaga faili nime
Programm peab töötama korrektselt ilma ühtegi synchronized plokki vajamata.
NB! Tulemuste komplekti queue kaudu saatmisel ei tohi andmete õiged tüübid kaduma minna. Loo vajadusel tulemuste hoidmiseks eraldi klass.
Vihje: Vaata Practice12 PahupidiPööraja koodi.
Vihje: Faili lugemiseks üks mugavamaid variante on Scanner.next().
Soovi korral võib threadid+BlockingQueue asemel kasutada ExecutorService+Future.