2016-03-23 11 views
0

Ich habe rund 900 Aufgaben. Ich habe Threadpoolzählung auf 50 festgelegt. Ich führe eine Schleife aus und übergebe jede Aufgabe an den ExecutorService.Executor Service fehlt einige Aufgaben

Sobald Kontrolle kommt nenne ich Abschaltung wie unter

for (Entry<String, String> CurrentJob : Tasks.entrySet()) { 
      m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey())); 
     } 
      m_service.shutdown(); 

Jede Aufgabe dauert etwa 1 Sekunde auf average.Now ich zwei Fragen

a) Fast alle von ihnen machen die Arbeit (850), aber ungefähr 50 sind verloren. Ich habe den Debugger auf Callable gesetzt, aber die Kontrolle kommt nicht einmal für diese spezielle Aufgabe. Obwohl wenn ich sie einzeln einsetze, funktionieren sie. Welche Logik des Executor-Dienstes fehlt mir?

b) Ich habe einen Timer um diesen Code gelegt und nach javaDoc Shutdown sollte warten, bis alle Threads fertig sind, aber mein Timer sagt immer Zeit Null genommen.

Antwort

0

Der ExecutorService wartet nicht darauf, dass zuvor übergebene Aufgaben abgeschlossen wurden. Aus dem JavaDocs:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--

Diese Methode wartet nicht, zuvor eingereichten Aufgaben Ausführung abzuschließen. Verwenden Sie awaistTermination, um dies zu tun.

So was kann passieren ist die ExecutorService abschaltet, setzt die Warteschlange Arbeit zu beenden, aber die JVM beendet, weil Ihr Hauptthread endet (nur Daemon-Threads zu verlassen, die nicht die JVM am Leben erhalten)? Vielleicht ist das das Problem?

+0

Nr. Das passiert nicht, weil die Kontrolle in 0 Sekunden beendet wird und meine Aufgabe auch nach 3-4 Minuten erledigt wird. nur aus Gründen der Argumentation ersetzt ich Shutdown mit awaistTermination auch. – user2449952

0

Um verworfene Aufgaben mit dem Executor-Service zu behandeln, stellt ThreadPoolExecutor die RejectedHandler-Klasse bereit.

Beispiel ThreadPoolExecutor threadP = (ThreadPoolExecutor) Executors.newFixedThreadPool (3); threadP.setRejectedExecutionHandler (neu RejectedHandler()); // hinzufügen Aufgaben

threadP.shutdown()

+0

BlockingQueue blockingQueue = neue ArrayBlockingQueue (1000); RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); m_service = neuer ThreadPoolExecutor (50, 50, 0L, TimeUnit.MILLISECONDS, blockingQueue, rejectedExecutionHandler); funktioniert immer noch nicht. Kannst du ein wenig ausarbeiten? – user2449952