Если бы вам пришлось немного реструктурировать свой дизайн, чтобы загрузка файла с диска и выгрузка файла на клиент не выполнялись в одном и том же потоке, вы могли бы подождать, пока доступ к файлу прекратится, просто заблокировав новые потоки.от чтения этого файла, затем итерации всех потоков, читающих из этого файла, и выполнения join () для каждого из них, по одному за раз.Пока потоки чтения файла прекращаются непосредственно после загрузки файла, итерация завершится в тот момент, когда последний поток больше не читает файл, и вы готовы к работе.
Следующий абзац основан наПредполагается, что вы продолжаете повторное чтение данных файла несколько раз, даже если потоки чтения одновременно читают в течение одного общего временного интервала, поскольку это звучит так, как будто вы делаете.
Делая это таким образомразделение чтения файла на отдельные потоки также позволит вам иметь один поток, загружающий определенный файл, и иметь несколько загрузок клиента, получающих данные с одного прохода чтения по файлу.С этим можно реализовать несколько оптимизаций, в зависимости от типа проекта.Если вы это сделаете, убедитесь, что вы не храните слишком много файловых данных в памяти, иначе произойдет очевидное.Но если вы гарантированы характером вашего проекта, что будет мало и / или небольших файлов, которые не будут занимать слишком много памяти, это отличный побочный эффект разделения загрузки файлов в отдельный поток.
Если вы идете по этому пути, используя join (), вы можете использовать вариант join (миллисекунды), если вы хотите, чтобы поток удаления мог ждать определенный период, а затем требовать остановки других потоков (для больших файлов и / или раз).когда доступ ко многим файлам, так что HD идет медленно), если они этого еще не сделали.Просто получите временную метку (now + theDurationYouWantToWait) и присоединитесь (impatientTimestamp-currentTimestamp), и отправьте прерывание всем потокам загрузки файлов в середине цикла, если (currentTimestamp> = impatientTimestamp) - тогда получите потоки загрузки файловпроверьте это в цикле, где они читают данные файла, затем повторно объедините () поток, из которого было прервано соединение (в миллисекундах), и продолжите итерацию объединения (), которую вы выполняли.