Сходство потоков Java

Кто-нибудь знает способ заблокировать отдельные потоки в процессе Java для конкретных ядер процессора (в Linux)? Я сделал это в C, но не могу найти, как это сделать в Java. Мои инстинкты заключаются в том, что для этого потребуется вызов JNI, но я надеялся, что кто-то здесь может иметь некоторое представление или мог сделать это раньше.

Спасибо!

5 ответов

Решение

Вы не можете сделать это на чистой Java. Но если вам это действительно нужно - вы можете использовать JNI для вызова нативного кода, который выполняет эту работу. Это место для начала:

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: Подумав, я решил создать свой собственный класс для этого: ThreadAffinity.java Он основан на JNA и очень прост - поэтому, если вы хотите использовать его в производстве, возможно, вам стоит потратить некоторое время на создание он более стабилен, но для тестирования и тестирования работает хорошо как есть.

UPD 2: В Java есть еще одна библиотека для работы со сходством потоков. Он использует тот же метод, что и ранее, но имеет другой интерфейс

Я знаю, что это было давно, но если кто-нибудь сталкивался с этой темой, вот как я решил эту проблему. Я написал сценарий, который будет делать следующее:

  1. "jstack -l"
  2. Возьмите результаты, найдите "nid" потоков, которые я хочу вручную привязать к ядрам.
  3. Taskset эти темы.

Это невозможно (по крайней мере, с простой Java).

Вы можете использовать пулы потоков, чтобы ограничить количество потоков (и, следовательно, ядер), используемых для различных типов работы, но нет способа указать ядро ​​для использования.

Существует даже (небольшая) вероятность того, что ваша среда выполнения Java не поддерживает собственные потоки для вашей ОС или оборудования. В этом случае используются зеленые потоки, и для всей JVM будет использоваться только одно ядро.

ИМО, это будет невозможно, если вы не используете родные звонки. Предполагается, что JVM не зависит от платформы, любые системные вызовы, выполняемые для достижения этой цели, не приведут к переносимому коду.

Другие вопросы по тегам