Java: как хранить несколько потоков, обрабатывающих разные файлы

#java #multithreading #concurrency

#java #многопоточность #параллелизм

Вопрос:

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

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

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

Есть предложения, как это реализовать?

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

1. Я не могу понять ваш вопрос. Что вы хотите сделать? Почему несколько потоков работают с одним файлом? Используете ли вы SSD-диски? Объясните, в чем настоящая проблема, а не как вы пытались ее решить.

2. Вы ищете Thread.join()?

3. рассмотрите возможность использования java.util.concurrent. CountDownLatch

4. Короче говоря, это сервер, с которого люди загружают файлы, клиенты подключаются и загружают файлы (возможно, один и тот же файл, возможно, разные). Каждый запрос открывает поток (чтобы не блокировать другие запросы). Затем поток получает запрос на имя файла и отправляет его одновременно, есть консоль сервера, с помощью которой я могу изменять файлы (переименовывать / удалять). итак, если я изменю файл a.txt и 3 человека загружают его, мне нужно, чтобы команда подождала и только затем изменила ее название.

5. Итак, пока эти 3 пользователя загружают, вы прекращаете предлагать файл, пока не будет завершен последний? Что, если последний пользователь работает очень медленно и на его завершение уйдут дни. Будет ли файл недоступен в течение этого времени только для пользователя, который его уже загружает? Возможно, вы рассматриваете сценарий, в котором уровень абстракции между файловой системой и вашим приложением имеет смысл. Может потребоваться отключение от блокировок файловой системы.

Ответ №1:

Мне нужна возможность дождаться завершения всех потоков определенного файла

Я не совсем понял ваше требование, но я думаю, что что-то вроде этого сработает для вас:

 // FileSender is the wrapper class you mentioned - where you keep track
// of file->threads association
public class FileSender {
    private final File file;

    private List<Thread> threads = new ArrayList<Thread>();

    public FileSender(File file) {
        this.file = file;
    }

    public void addThread(Thread thread) {
        if (thread != null) {
            this.threads.add(thread);
        }
        for (Iterator<Thread> itr = threads.listIterator(); itr.hasNext();) {
            Thread t = itr.next();
            if (! t.isAlive()) {
                itr.remove();
            }
        }
    }

    // this method blocks until all threads associated with
    // this file has completed execution
    public void waitForCompletion() throws InterruptedException {

        for (Iterator<Thread> itr = threads.listIterator(); itr.hasNext();) {
            Thread thread = itr.next();
            thread.join();
            itr.remove();
        }
    }
}