Mejores prácticas de subprocesamiento múltiple: restringir tareas newFixedThreadPool

Quiero iniciar muchas tareas para ejecutar en una base de datos de registros de + -42Mio. Quiero ejecutar esto en lotes de 5000 registros / tiempo (resultados en 850 tareas). También quiero limitar el número de subprocesos (a 16) java comienza a hacer esto por mí y estoy usando el código actual para realizar esta tarea:

 ExecutorService executorService = Executors.newFixedThreadPool(16);
 for (int j = 1; j < 900 + 1; j++) {
     int start = (j - 1) * 5000;
     int stop = (j) * 5000- 1;
     FetcherRunner runner = new FetcherRunner(routes, start, stop);
     executorService.submit(runner);

     Thread t = new Thread(runner);
     threadsList.add(t);
     t.start();
 }

¿Es esta la manera correcta de hacer esto? Particularmente porque tengo la impresión de que Java simplemente dispara todas las tareas ... (FetcherRunner implementosrunnable)

Respuestas a la pregunta(5)

Su respuesta a la pregunta