/ / Existe um conjunto de threads padrão em java - java, multithreading

Existe um pool de threads padrão em java - java, multithreading

Posso criar um novo pool de threads em java e executar tarefas nele usando o ExecutorService.newFixedThreadPool e ExecutorService.submit métodos.

Existe um pool de threads "padrão" que eu possa reutilizarpara todos os serviços executores no meu programa java? Ou preciso apenas criar um singleton que contenha um pool de threads padrão? C # tem um pool de threads padrão que executa tarefas quando o Task.Factory.StartNew método é chamado.

Respostas:

5 para resposta № 1

O uso de conjuntos de threads separados é uma prática recomendada e o compartilhamento de conjuntos de threads é uma otimização (possivelmente prematura).

No Java 7, a resposta é não, não há umapool de threads padrão e a recomendação é ter muitos pools de threads. É uma boa separação e impedirá que o comportamento de bloqueio em uma coleção de tarefas interfira em outra.

Se você compartilha poços de rosca, faça perguntas como:

  • a estrutura de log será capaz de distinguir tarefas? (Threads é uma maneira de distinguir.)
  • Se o pool de tarefas A solicitar acidentalmente muitos encadeamentos e for cortado, o pool de tarefas B deve passar fome? Quando você perceber que o pool de tarefas B está falhando, você poderá diagnosticar o problema no pool de tarefas A?
  • Se os blocos da piscina A devem B morrer de fome?

Talvez você crie algo como um LightweightThreadpool. E as 5 primeiras tarefas que você escreve usam-namoda leve. E a sexta tarefa ... sim, exceto que também grava erros no disco, e esses erros são surpreendentemente grandes e, às vezes, existem muitos deles, e eles não são limitados. De repente, as 5 primeiras tarefas passam fome e não têm idéia do que as atingiu; além disso, quando você as escreveu, realmente acreditou que elas estavam seguras e talvez não se preparassem para esse tipo de incidente.

Portanto, compartilhar poços de rosca é tão bom quanto terdois processos diferentes executados no mesmo servidor estão bem. Você deve pensar sobre o gerenciamento de recursos com muito cuidado primeiro e entender que as tarefas estão acopladas agora. A falta de um conjunto de encadeamentos padrão está tentando forçá-lo a usar outros separados por padrão, e pense nessas perguntas cuidadosamente antes de compartilhar uma.

No Java 8, a resposta é "sim" (por A resposta de Tagir sobre esta pergunta) Mas você notará que tudo começará a falhar terrivelmente se você enviar tarefas de bloqueio para esse conjunto de encadeamentos.


9 para resposta № 2

Desde o Java-8, há " ForkJoinPool.commonPool() que é usado por padrão por muitos métodos que envolvem execução paralela ou assíncrona. Por exemplo, Arrays.parallelSort() ou a operação paralela da API de Stream usa esse pool. Você pode enviar suas próprias tarefas para esse pool usando muitos métodos de CompletableFuture classe como CompletableFuture.supplyAsync().