Обнаружение прерывания потока с помощью встроенного вызова ожидания JNA (Windows)

#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, чтобы попытаться извлечь дескриптор события, который он использует внутри.