Você pode determinar o número de processos disponíveis para a Java Virtual Machine usando o método estático Runtime, availableProcessors . Depois de determinar o número de processadores disponíveis, crie esse número de threads e divida seu trabalho de acordo.
Atualização : Para esclarecer ainda mais, um Thread é apenas um Objeto em Java, então você pode criá-lo como faria com qualquer outro objeto. Então, digamos que você chame o método acima e descubra que ele retorna 2 processadores. Impressionante. Agora, você pode criar um loop que gera um novo Thread, divide o trabalho para aquele thread e dispara o thread. Aqui estão alguns psuedocódigo para demonstrar o que quero dizer:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
Para obter mais informações sobre como criar seu próprio tópico, vá para este tutorial . Além disso, você pode querer dar uma olhada em Thread Pooling para a criação de threads.
Você provavelmente deseja examinar a estrutura java.util.concurrent para essas coisas também. Algo como:
ou
Isso é muito mais agradável do que lidar com seus próprios pools de threads, etc.
fonte
Opção 1:
newWorkStealingPool de
Executors
Com esta API, você não precisa passar o número de núcleos para
ExecutorService
.Implementação desta API de grepcode
Opção 2:
API newFixedThreadPool de
Executors
ouother newXXX constructors
, que retornaExecutorService
substituir nThreads por
Runtime.getRuntime().availableProcessors()
Opção 3:
ThreadPoolExecutor
passe
Runtime.getRuntime().availableProcessors()
como parâmetro paramaximumPoolSize
.fonte
Doug Lea (autor do pacote concorrente) tem este artigo que pode ser relevante: http://gee.cs.oswego.edu/dl/papers/fj.pdf
A estrutura Fork Join foi adicionada ao Java SE 7. Abaixo estão mais algumas referências:
http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html Artigo por Brian Goetz
http://www.oracle.com/technetwork/articles/java/fork-join-422606.html
fonte
A forma padrão é o método Runtime.getRuntime (). AvailableProcessors (). Na maioria das CPUs padrão, você retornou a contagem ideal de threads (que não é a contagem real do núcleo da CPU) aqui. Portanto, é isso que você está procurando.
Exemplo:
NÃO se esqueça de encerrar o serviço do executor desta forma (ou seu programa não sairá):
Aqui está apenas um esboço rápido de como configurar um código MT baseado no futuro (offtopic, para ilustração):
Em seguida, você precisa acompanhar quantos resultados espera e recuperá-los assim:
fonte
Na classe Runtime, existe um método chamado availableProcessors (). Você pode usar isso para descobrir quantas CPUs você tem. Como seu programa é limitado pela CPU, você provavelmente desejaria ter (no máximo) um thread por CPU disponível.
fonte