Подтвердить что ты не робот

Слияние Java-потоков

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

Спасибо!

4b9b3361

Ответ 1

Вы не можете сделать это в чистой 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. Он использует тот же метод, что и ранее, но имеет другой интерфейс

Ответ 2

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

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

Ответ 4

IMO, этот не будет возможен, если вы не используете собственные вызовы. JVM должен быть независимым от платформы, любые системные вызовы, выполненные для этого, не приведут к переносу кода.

Ответ 5

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

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

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