Я хотел бы настроить файл блокировки для чтения на Java. То есть иметь такой файл, что при обертывании FileInputStream
и вызове любого метода read()
вызов блокируется.
Я не могу придумать простой независимый от ОС способ - в Unix-подобных ОС я мог бы попытаться создать FIFO, используя mkfifo
, и прочитать из этого файла. Возможным обходным решением было бы просто создать очень большой файл и прочитать его - чтение вряд ли завершится до того, как я зафиксирую стек, но это уродливо и медленно (и действительно чтение может быть невероятно быстрым при кэшировании).
Соответствующий случай сокета read()
настроить тривиально — создайте сокет сами и прочитайте из него, и вы можете иметь детерминированную блокировку.
Цель состоит в том, чтобы изучить стек метода, чтобы определить, каковы верхние кадры в таком случае. Представьте, что у меня есть компонент, который периодически выбирает трассировку стеков всех запущенных потоков, а затем пытается классифицировать, что этот поток делает в данный момент. Одна вещь, которую он может делать, это файловый ввод-вывод. Поэтому мне нужно знать, как выглядит «верхняя часть стека» во время файлового ввода-вывода. Я уже определил это экспериментальным путем (просто прочитайте файл различными способами и попробуйте стек), но я хочу написать тест, который потерпит неудачу, если это когда-либо изменится.
Естественный способ написать такой тест — запустить поток, который читает файл, а затем проверить верхние кадры. Чтобы сделать это надежно, мне нужно блокирующее чтение (иначе поток может завершить чтение до того, как будет взята трассировка стека и т. д.).
FileInputStream.getChannel()
и постоянный сброс курсора будут работать, поскольку это на некоторое время изменит трассировку стека. Если вы думаете, что это возможно, я могу расширить ответ. Точно так же я предполагаю, что расширение FileInputStream не будет работать, поскольку это методы FileInputStream.read *, которые вы пытаетесь снять, если я правильно понимаю. - person J Richard Snape   schedule 28.01.2015FIS
, но проблема в том, что я не могу получить дамп из потока, выполняющего чтение. По определению, когда метод nativeread0
(или любой другой) находится на вершине стека, я не контролирую ситуацию и не могу сбросить этот поток. Конечно, я мог бы сделать это и раньше, но это дает мне правильный верхний кадр или два. - person BeeOnRope   schedule 31.01.2015