Usar mais de um núcleo numa aplicação JAVA

Terminei uma aplicação JAVA aqui, e gostaria de saber como fazer a máquina virtual escalonar o processamento para mais de um núcleo. Testei aqui num Core i3, e só tá usando apenas 1 dos 4 núcleos, já quando testei num Celeron de um núcleo, ele usa a potência máxima, e o software apresenta estar fluindo melhor.

Para usar os vários núcleos uma aplicação pode usar várias threads. Digamos que você tenha um programa que use 100% de uma única CPU, e esse Core i3 tenha 2 núcleos e 4 threads. O Windows vai mostrar como se ele estivesse gastando apenas 25% de CPU (porque ele contabiliza o processamento entre as diversas CPUs).

Pelo que estou imaginando, sua máquina Celeron está rodando seu programa mais rapidamente porque não deve estar rodando também algum software de segurança pesado, como um antivírus ou o SCUA, enquanto seu Core i3 já está usando alguma coisa que deve atrapalhar o Java (o McAfee, por exemplo, é notório por tentar escanear todos as classes de um .jar antes de deixar o Java iniciar seu programa.

A propósito, não existem “Core i3 Quad”. Todos eles têm 2 núcleos (cores) e muitos deles têm 4 threads, que é o que você visualiza.

Ambos os notebook estão com os mesmos programas, só muda a potência.

Core i3, com esse processador: http://ark.intel.com/pt-br/products/53438

Mais tarde vou testar no meu desktop (i7 Sandy Bridge), para saber se o problema é realmente com os multi cores ou só no notebook.

não é uma questão do processador em questão, mas sim da forma como você deixou o seu programa. Se você tiver colocado várias threads para executarem simultaneamente, elas serão escalonadas para quando houver a “oportunidade”, ficar uma executando em um core e outra no outro, se vocÊ não deixou o seu código prevendo esse cenário não há o que fazer para que vários núcleos executem simultaneamente…

Eu coloquei Thread onde necessário, inclusive a SwingWorker também. Mais tarde posto o teste que fiz no i7.

Tenta iniciar a VM com -XX:+UseParallelGC (Paralelismo no Garbage Collector)

Geralmente costuma ficar mais rapido em máquinas com mais de 1 nucleo…

o que o maior_abandonado postou é uma verdade. O desempenho depende inteiramente do problema em si. Existem alguns casos que várias threads realizam um pior trabalho que o de apenas uma e um software desenhado para um processador vai apresentar melhor desempenho que em outro. Não importa se foi escrito com java, c#, c++, etc…

Estou percebendo a mesma coisa, tenho um projeto de rede neural que faz vários calculos e mesmo possuindo o i7, verifiquei o uso de apenas cerca de 25% em apenas um núcleo.
porque nao pode usar pelo menos 100% de um único nucleo?

Estranhamente, fiz um programa executavel em C++ que faz um grande loop com um calculo de simples de multiplicacao, os resultados são parecidos.

Digamos que você tenha um programa mais ou menos assim:

while (true) {
}

Ou seja, é uma coisa que:
a) Gasta 100% de uma única CPU
b) Não pode ser paralelizada

Se você rodar esse programa em uma máquina com 4 CPUs, você vai ver que:
a) O “scheduler” do Windows transfere a propriedade dessa thread de uma CPU para a outra continuamente (ele faz isso porque é assim, oras bolas!)
b) Em média, cada CPU fica com 1/4 = 25% do tempo em cada uma
c) Por isso, você tem a impressão que o Windows está ocupando só 25% da CPU.

Se você então acertar a “afinidade” desse processo para rodar em uma determinada CPU (clicar com o botão direito no Task Manager do Windows e usar o recurso “Set Thread Affinity”) você vai ver que ele então vai dividir a propriedade da thread apenas nas CPUs que você determinou para a afinidade. Em particular, se você setar a thread affinity para apenas uma única CPU, vai ver que essa CPU vai ficar com 100% (como você esperava) e as outras vão ficar próximas de 0 (porque estão sendo usadas por outras coisas, é claro).

Alguns outros sistemas operacionais percebem essa situação e não ficam transferindo uma thread que está “travada” de uma CPU para a outra. Mas o Windows (talvez para não esquentar demais uma CPU, quem sabe?) fica transferindo a thread de uma CPU para a outra continuamente, a menos que você especifique isso explicitamente.

Aliás, no Windows 7 há uma coisa bizarra, que é o recurso de “park” de uma CPU.
Digamos que você tenha comprado um notebook com 4 núcleos e 8 threads.
Você acha que o Windows habilita todos as threads para processamento? Não. Ele, alegadamente para economizar bateria, deixa 4 threads desses núcleos desabilitadas (“parked”) e habilita as outras 4. Você só consegue descobrir isso usando o “Resource Manager” (uma opção que aparece no Task Manager).
Para habilitar todas as threads (ou seja, o recurso de HyperThreading) você precisa mexer no Registry.