/ / Java - Správa veľkého počtu vlákien v porovnaní s multicore - java, multithreading

Java - Správa veľkého počtu vlákien verzus multicore - java, multithreading

V súčasnosti sa zaoberám skriptom, ktorý vykonáva určité kontroly a vkladania pre každú databázu servera Mongo. Je to multithreading.

for (int i = 0; i < countDatabase; i++) {
new threadDatabase(database.get(i).toString()).start();
}

Problém: Mám 16 databáz na analýzu ... obávam sa, že PC, na ktorom bude skript nastavený, nevyhrá 16 (alebo viac) vlákien ...

Nejaké nápady, ako riešiť veľké množstvo vlákien? Počul som o bazéne, ale nie som si istý, či sa môže vysporiadať s názvom databázy, ktorý pošlem ako parameter ...

Vďaka

odpovede:

2 pre odpoveď č. 1

16 vlákien na PC?

Pri pohľade na môjho Správcu úloh / Výkon systému Windows sa zobrazuje 1238 vlákien spustených. To nie je ani zlomenie potu. Najvyšším procesom je sidebar.exe - 66 vlákien.

OK, takže spúšťate ďalšie vlákna typu U ** xy OS - 16, ktoré pravdepodobne nebudú mať problém.

16 vlákien nie je nič. Ak sú všetky náročné na CPU, box sa načíta, ale hej, to je bod!

Vyskúšajte fond, ak musíte, možno sa pokúsite vylepšiť výkon, ale nerobte to len preto, lebo sa obávate, že 16 vlákien je pre váš OS príliš veľa.

Rgds, martin


5 pre odpoveď № 2

16 vlákien nie je veľa vlákien. Iste, je to pravdepodobne viac vlákien, ako máte jadrá CPU, ale ak hovoríte so vzdialenou databázou, je pravdepodobné, že budete tráviť väčšinu času čakaním na dokončenie I / O, aby CPU nevyšiel. obmedzujúci faktor.

Okrem toho by vlákno pool pre vás fungoval dobre:

ExecutorService executorService = ...;
for (int i = 0; i < countDatabase; i++) {
final String dbName = database.get(i).toString();
executorService.submit(new Runnable(){
@Override
public void run() {
parseDatabase(dbName);
}
});
}