Afinidad con el hilo de Java

¿Alguien sabe de una forma de bloquear hilos individuales dentro de un proceso Java para núcleos de CPU específicos (en Linux)? He hecho esto en C, pero no puedo encontrar cómo hacerlo en Java. Mi instinto es que esto requerirá una llamada JNI, pero esperaba que alguien aquí pudiera tener alguna idea o podría haberlo hecho antes.

¡Gracias!

No puedes hacer esto en Java puro. Pero si realmente lo necesita, puede usar JNI para llamar al código nativo que hace el trabajo. Este es el lugar para comenzar:

http://ovatman.blogspot.com/2010/02/using-java-jni-to-set-thread-affinity.html

http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-java/

UPD: Después de pensar un poco, he decidido crear mi propia clase para esto: ThreadAffinity.java Está basado en JNA, y es muy simple, entonces, si quieres usarlo en producción, deberías dedicar un tiempo a hacer es más estable, pero para la evaluación comparativa y las pruebas funciona bien tal como está.

UPD 2: hay otra biblioteca para trabajar con la afinidad de hilos en Java. Utiliza el mismo método que se indicó anteriormente, pero tiene otra interfaz

Sé que ha pasado un tiempo, pero si alguien encuentra este hilo, así es como resolví este problema. Escribí un script que haría lo siguiente:

  1. “jstack -l”
  2. Tome los resultados, encuentre los “nid” de los hilos que quiero bloquear manualmente en núcleos.
  3. Taskset esos hilos.

OMI, esto no será posible a menos que use llamadas nativas. Se supone que JVM es independiente de la plataforma, cualquier llamada al sistema realizada para lograr esto no generará un código portátil.

No es posible (al menos con Java simple).

Puede usar grupos de subprocesos para limitar la cantidad de subprocesos (y, por lo tanto, núcleos) utilizados para diferentes tipos de trabajo, pero no hay forma de especificar un núcleo para usar.

Incluso existe la (pequeña) posibilidad de que el tiempo de ejecución de Java no sea compatible con el enhebrado nativo para su SO o hardware. En este caso, se utilizan subprocesos verdes y solo se usará un núcleo para toda la JVM.