Acest proiect implementează un agregator de știri eficient, utilizând concepte de paralelizare în Java. Obiectivul principal este procesarea rapidă a unui volum mare de articole din fișiere JSON, gruparea acestora, eliminarea duplicatelor și numărarea aparițiilor cuvintelor cheie, respectând constrângerea de a instanția thread-urile o singură dată.
Implementarea folosește modelul Replicated Workers și împarte munca în trei etape principale:
-
Faza 1: Prelucrarea fișierelor cu articole - Aceasta este cea mai costisitoare operație. Fiecare thread citește articolele din propriul fișier JSON, actualizând structurile globale (titluri, UUID-uri, limbi, categorii, autori) și adăugând articolele într-o listă partajată.
-
Faza 2: Procesarea cuvintelor cheie - După eliminarea duplicatelor, lista de articole este împărțită în bucăți egale (chunks). Fiecare thread preia un chunk, extrage cuvintele semnificative (ignorând linking words) și actualizează contorul global pentru fiecare cuvânt.
-
Faza 3: Sortarea finală - Operațiunile de sortare a articolelor și a keyword-urilor, fiind costisitoare, sunt delegate unor thread-uri separate.
Pentru a asigura o execuție corectă și fără race conditions, proiectul minimizează sincronizarea manuală prin utilizarea de structuri thread-safe și unelte standard Java:
-
ExecutorService: Creează un pool fix de thread-uri reutilizabile pentru toate task-urile. Se folosește submit() pentru alocarea task-urilor și Future.get() pe post de barieră de sincronizare între etape.
-
ConcurrentHashMap: Utilizat pentru a ține evidența câmpurilor (titluri, UUID, autor, limba, categorii) și a articolelor în care apar, prevenind problemele de concurență.
-
Collections.synchronizedList: Protejează lista globală în care toți workerii adaugă articolele citite.
-
AtomicInteger: Folosit pentru incrementarea atomică (ex. incrementAndGet()) la contorizarea autorilor și a cuvintelor cheie, evitând coliziunile.
Proiectul a fost testat pe un set de date generos (60.340 de articole) folosind un procesor AMD Ryzen 7 7840HS (8 nuclee / 16 fire de execuție).
-
Timp de execuție secvențial (1 thread): ~46.81 secunde
-
Timp optimizat (4 thread-uri): ~19.37 secunde
-
Speedup maxim atins: ~2.42x
Arhitectura scalează eficient până la 3-4 thread-uri, punct în care performanța se plafonează din cauza porțiunilor secvențiale inevitabile (citirea de pe disc, sortările finale) și a overhead-ului de sincronizare. Numărul optim de thread-uri pentru acest setup este 4.