[DÚVIDA] Alocação de Thread para Core específico

Olá, gostaria de saber se é possível, em JAVA, eu setar uma Thread para executar em determinado Core de um processador Multi Core.
Por exemplo, se eu tenho um processador Dual Core, e eu quero calcular a soma das linhas de uma matriz. Existe alguma forma de criar uma Thread para somar a primeira linha e manda-la executar especificamente com o 2° Core do processador?

Se for possível, e puderem dar um exemplo, fico muito grato, obrigado!

Isso se chama “thread affinity” e pode ser forçado, no Windows, chamando-se algumas APIs (que você talvez possa chamar via JNA) :

http://msdn.microsoft.com/en-us/library/ms684251(v=vs.85).aspx

Hum, o problema é que eu preciso de uma solução em Linux, se houver.
Qualquer comentário ou ajuda é de grande valor, obrigado!

so por curiosidade, porque precisa de especificar o core para execucao dessa thread?

Há um custo envolvido ao transferir a execução de uma thread de um processador para outro.

Isso é mais notado quando os caches não são compartilhados, o que pode ocorrer em máquinas com múltiplos processadores (não somente múltiplos cores).

Se você, por exemplo, tiver um processo com 10 threads efetuando cálculos matemáticos complexos em uma máquina com 16 processadores, seria interessante alocar para cada thread o seu processador, o que é feito via “thread affinity”. Você ainda tem 6 processadores para fazer outras coisas, e gasta 100% de cada processador alocado apenas com contas, não com burocracia (ou seja, “cache misses”) de mover a execução de um processador para outro.

Em Windows você pode usar a função SetThreadAffinityMask para a mesma finalidade.
Curioso esse tópico aparecer hoje, pois ontem mesmo eu estava lendo sobre timers de alta precisão no Windows e recomenda-se usa-los com apenas um único processador, para evitar obter medidas de timers diferentes por causa de um problema na BIOS ou na camada de acesso ao hardware (HAL).

Veja um exemplo real de uso do método:

[code]LONGLONG GameWindow::QueryCounter() const
{
//Definindo a afinidade apenas para o processador 0
DWORD_PTR oldmask = SetThreadAffinityMask(GetCurrentThread(), 0);

//Faz a leitura do Timer
LARGE_INTEGER time;
QueryPerformanceCounter(&time);

//Devolvendo a afinidade para a forma que estava antes
SetThreadAffinityMask(GetCurrentThread(), oldmask);
return time.QuadPart;

}[/code]