#java #windows #multithreading #jna
#java #Windows #многопоточность #jna
Вопрос:
Я пытаюсь написать некоторый код, который выполняет ожидание через JNA (например, путем вызова функции Kernel32 WaitForSingleObject), но я также хотел бы, чтобы ожидание завершалось, если вызывается Thread.interrupt() ; Я предполагаю, что Java использует что-то вроде объекта события для реализации прерывания; есть ли какой-либо способ получитьсобытие из Java, чтобы использовать его при вызове WaitForMultipleObjects? Или есть какой-либо другой способ, которым я мог бы организовать завершение моего ожидания, если поток прерывается?
Ответ №1:
Java поддерживает это через NIO, и очень немногие знают, что рассматриваемый класс является абстрактным, но это не проблема:
java.nio.channels.spi.AbstractInterruptibleChannel
. У него есть 3 интересующих метода: begin()
и end()
они являются окончательными, плюс тот, который вы должны реализовать: «защищенный абстрактный void implCloseChannel() вызывает исключение IOException» Метод будет вызываться из потока, вызывающего interrupt() , поэтому будьте осторожны.
Использование очень простое: вызов begin перед вводом собственного кода и end() при возврате. Обработка прерывания в implCloseChannel.
Счастливого кодирования!
Комментарии:
1. Спасибо. Это намного лучше, чем то, как я это делал.
Ответ №2:
Найдя немного времени для проведения дополнительных исследований, сегодня утром я отправился на раскопки в исходном коде OpenJDK. Оказывается, что запуск с собственной реализации был неправильным; для этого есть механизм pure-Java.
Класс sun.разное.SharedSecrets имеет статический метод getJavaLangAccess(), который возвращает объект с методом blockedOn(Thread, sun.nio.ch.Прерываемый). Это можно использовать для организации вызова Thread.interrupt() для вызова метода, предоставляемого одним из моих собственных объектов, после чего я могу создать свой собственный объект события прерывания, с помощью которого я могу гарантировать, что ожидания будут завершены по мере необходимости.
Выполнение этого вводит зависимости от реализации sun библиотеки классов Java, но, вероятно, в меньшей степени, чем копание в собственном состоянии JVM, чтобы попытаться извлечь дескриптор события, который он использует внутри.