#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 (), когда они закончат