Отслеживание файлов, загружаемых разными потоками

#java #multithreading #io #executorservice

#java #многопоточность #io #executorservice

Вопрос:

На Java я пытаюсь написать FileManager, который содержит каталог файлов и загружает их в другие FileManagers по запросу. Каждый раз, когда поступает запрос на загрузку (через сокет), создается новый поток для обработки загрузки запрошенного файла.

Я думал об использовании ExecutorService и a FileUploader implements Runnable для решения этой проблемы.

т.е. если sessions — это ExecutorService, а mySocket — сокет, к которому FileManager прослушивает запросы, создание каждого потока будет выглядеть примерно так:

 sessions.execute(new FileUploader(mySocket.accept()));
  

Проблема в том, что если FileManager получает команду переименовать файл в своей базе данных, ему необходимо дождаться завершения всех потоков, которые в данный момент загружают файл, прежде чем переименовывать файл.

Итак, вопрос в том, как я могу отслеживать, сколько / какие потоки загружают данный файл?

Комментарии:

1. На самом деле, в Linux вы можете переименовать файл во время его чтения или записи, и другой поток продолжит корректно работать (при условии, что он просто использует дескриптор файла и не делает причудливых вещей, таких как попытки закрыть и повторно открыть файл).

Ответ №1:

Вы можете использовать CountDownLatch, связанный с каждым именем файла, которое вы хотите передать. Ваш средний поток должен попытаться await () на защелке и начать обработку только тогда, когда он получит защелку, а ваши дочерние элементы должны использовать countDown (), когда они закончат