#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();
}
}
}