Dlaczego tylko dwa wątki jednocześnie?

0

Taki oto kod:

public class CommandLine implements Runnable{
        
    Ip ip;
    Settings settins = new Settings();
    Settings s = new Settings();

    public CommandLine(Ip ip) throws IOException, InterruptedException {
        this.ip=ip;
              
         String command = "ping -n "+s.getNumberOfPingCycles()+" "+ip.ip;       
         StringBuffer output = new StringBuffer();
         Process p = Runtime.getRuntime().exec(command);
         p.waitFor();
         BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
         String outputLine = "";
         
                while ((outputLine = reader.readLine())!= null) {
                        output.append(outputLine);
                        System.out.println(outputLine); }                    
    } 
    @Override
    public void run() {
        try {
            new CommandLine(ip);
            } catch (IOException ex) {Logger.getLogger(CommandLine.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {Logger.getLogger(CommandLine.class.getName()).log(Level.SEVERE, null, ex);}}
}

Proste polecenie ping sprawdzające odpowiedz adresów sieciowy. Jako że ustawiam ilość cykli np na 200 troche to trwa. Adresów do sprawdzenia też mam koło 300. Cała operacja zajmie więc kilka godzin, dlatego chce uruchomic jednocześnie ping dla wszystkich adresów z puli co znacznie skróci mi czas. Wymysliłem sobie że uruchomie to w wątkach o tak:

ArrayList<Ip> ipList = r.getIpListFromExcel();
    Thread[] watki = new Thread[ipList.size()];
    
    for(int i =0 ; i<ipList.size(); i++){
        watki[i] = new Thread(new CommandLine(ipList.get(i)));
    }
    
    for(int i =0 ; i<ipList.size(); i++){
        watki[i].start();
    }

Niestety działaja tylko dwa wątki jednocześnie (domysla się że to od liczby rdzeni procesora). Czy mój pomysł jest możliwy do wykonania, niestety z wątkami nie mam dużo doświadczeń.

1

Twoja logika jest w konstruktorze, wiec przy tworzeniu obiektu CommanLine, ping wykona sie w glownym watku (main).
Potem tworzysz nowa instancje w metodzie run() i ping wykona sie ponownie (tym razem w nowym watku).

W konstruktorze zostaw tylko this.ip=ip, przenies cala logike do metody run() i nie tworz tam juz nowej instancji CommandLine, a tylko wykorzystaj this.ip i bedzie dzialac.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.