[FIXED] Wie starte ich den nächsten Thread, wenn einer von 5 Threads gestoppt wird?

Ausgabe

Ich erstelle ein Programm, um eine Logik mit Hilfe eines Threads parallel auszuführen. Die Logik muss in einer Schleife einer Liste ausgeführt werden, und diese Liste kann 1000 zu verarbeitende Zeilen enthalten. Daher habe ich jeden Thread in einer Schleife gestartet, und sobald die Threadgröße 5 erreicht, rufe ich thread.join für alle 5 gestarteten Threads auf. Ich denke also, dass dies den 2. Satz von 5 Threads erst starten wird, nachdem der erste Satz von 5 Threads abgeschlossen ist? ist mein Verständnis richtig? Ich bin ein bisschen neu in Threads.

Also muss ich den 6. Thread starten, wenn einer der vorherigen 5 Threads abgeschlossen ist. oder beginnen Sie mit dem 6. und 7., wenn 2 im vorherigen Satz von Threads abgeschlossen sind.

Mein Code

public static void executeTest(){
         for (int i = 0; i < rows1; i++) {
                    RunnableInterface task = new New RunnableInterface(params);
                    Thread thread = new Thread(task);
                    thread.start();
                    threads.add(thread);
                    if ((threads.size() % 5 == 0) || ((i == rows1-1) && (threads.size() < 5))) {
                        waitForThreads(threads);
                    }
                }
}
    private static void waitForThreads(List<Thread> threads) {
            for (Thread thread : threads) {
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            threads.clear();
        }

Welche Art von Modifikation muss ich vornehmen, um die oben genannten Ergebnisse zu erzielen?

Lösung

Sie können eine ExecutorServicemit unbegrenzter Eingabewarteschlange und einer festen Anzahl von Threads wie folgt verwenden:

ExecutorService exec = Executors.newFixedThreadPool(5);
// As many times as needed:
for(int i = 0; i< 100_000; i++) {
    Runnable myrunnable = () -> {}; // new RunnableInterface(params)
    exec.submit(myrunnable);
}
exec.shutdown();
exec.awaitTermination(1, TimeUnit.DAYS);

In JDK19 ist der Executor-Dienst AutoClosable, sodass Sie Folgendes vereinfachen können:

try (ExecutorService exec = Executors.newFixedThreadPool(5)) {
   ...
}


Beantwortet von –
DuncG


Antwort geprüft von –
Terry (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like