Práticas recomendadas multithreading: restringindo tarefas newFixedThreadPool

Eu quero lançar muitas tarefas para rodar em um banco de dados com registros de + -42Mio. Eu quero executar isso em lotes de 5000 registros / tempo (resulta em 850 tarefas). Eu também quero limitar o número de threads (para 16) java começa a fazer isso por mim e estou usando o código atual para realizar essa tarefa:

 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();
 }

Esta é a maneira correta de fazer isso? Particularmente, como tenho a impressão de que o java apenas atira todas as tarefas ... (FetcherRunner implementarunnable)

questionAnswers(5)

yourAnswerToTheQuestion