Слияние Java-потоков
Кто-нибудь знает способ блокировки отдельных потоков в процессе Java для конкретных ядер процессора (в Linux)? Я сделал это на C, но не могу найти, как это сделать на Java. Мои инстинкты состоят в том, что для этого потребуется вызов JNI, но я надеялся, что кто-то здесь может иметь некоторое представление или, возможно, сделал это раньше.
Спасибо!
Ответы
Ответ 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 те потоки.
Ответ 3
Вы можете взглянуть на https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/test/java/com/higherfrequencytrading/affinity/AffinityLockBindMain.java
Ответ 4
IMO, этот не будет возможен, если вы не используете собственные вызовы. JVM должен быть независимым от платформы, любые системные вызовы, выполненные для этого, не приведут к переносу кода.
Ответ 5
Это невозможно (по крайней мере, с простой Java).
Вы можете использовать пулы потоков, чтобы ограничить количество потоков (и, следовательно, ядер), используемых для разных видов работы, но нет способ указать ядро для использования.
Существует даже (небольшая) возможность того, что ваша среда исполнения Java не поддерживает собственную поточную передачу для вашей ОС или оборудования. В этом случае используются зеленые потоки, и для всего JVM будет использоваться только одно ядро.