Ich habe eine Liste von 40000 Datensätze, die in einer for-Schleife verarbeitet werden müssen. Da ich ein Zwei-Prozessor-System habe. Ich habe eine fixedThreadPool wie folgt erstellt:ExecuterService beendet die Verarbeitung eines Threads von zwei
int threads = Runtime.getRuntime().availableProcessors(); ExecutorService service = Executors.newFixedThreadPool(threads);
und teilte meine
ArrayList
in zwei Teil-Listen. Für jede dieser Unterlisten habe ich eineCallable
erstellt, die die gleiche Funktion ausführt (beinhaltet das Iterieren über die Unterliste und einige Verarbeitungen) und gibt mir ein ObjektFuture
zurück.Ich legte diese beiden
Callable
executorServiceObject.submit(callable)
mit und fügte hinzu, die zurückFuture
Objekt in meiner Liste derFuture
Objekte
Hier ist meine Frage:
ich System.Out.printLn("Processed Item" +item.id) // consider item as the name of reference variable for current iteration
Alles geschrieben war für einige Zeit in Ordnung, und ich konnte sehen, dass zwei Threads simultan arbeiten. Aber nach einiger Zeit hat einer der Threads die Verarbeitung beendet. Nur ein Thread wird ausgeführt. (Ich weiß das, weil ich auf der Konsole sehen kann, dass die ID für Thread 2 nicht mehr gedruckt wird).
Weiß jemand, wie das passiert ist? Ich meine, warum ExecutorService den 2. Thread gestoppt hat.
Vielen Dank für Ihre Hilfe im Voraus.
Hinzufügen von Beispielcode, wie ich vorher getan haben sollte:
public List<Output> processInputs(List<Input> inputs)
throws InterruptedException, ExecutionException {
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(threads);
List<Future<Output>> futures = new ArrayList<Future<Output>>();
for (final Input input : inputs) {
Callable<Output> callable = new Callable<Output>() {
public Output call() throws Exception {
Output output = new Output();
// process your input here and compute the output
return output;
}
};
futures.add(service.submit(callable));
}
service.shutdown();
List<Output> outputs = new ArrayList<Output>();
for (Future<Output> future : futures) {
outputs.add(future.get());
}
return outputs;
Bitte bearbeiten Sie Ihre Frage, um den entsprechenden Code in Ihr Programm aufzunehmen. Im Idealfall sollten Sie ein [mcve] einschließen, das das Problem reproduziert. – Kenster
Das kann nicht wirklich gestoppt werden. Es kann im Wartezustand sein. Überprüfen Sie die run-Methode des nicht funktionierenden Threads und sehen Sie, welche Zeile zuletzt ausgeführt wurde. – pikrut
@pikrut Ich habe 'Callable' verwendet, also gibt es keine run() Methode. Zweitens wird das Callable in einer for-Schleife erzeugt (1 für 1 Unterliste aufrufbar). Das bedeutet, dass die Aufrufmethode für beide Unterlisten gleich ist. – Aman