Я ищу несколько раз для записи в файлы (100k +), и записи будут происходить по разветвленной сети. Таким образом, чтобы сделать это, я рассматриваю с помощью Java ExecutorService
, чтобы помочь генерировать потоки, но я не совсем уверен, какая комбинация настроек будет правильно сделать следующее произойдет:Правильный способ обработки записи файлов в отдельных потоках
- только позволяют 1 запись произойдет в то время, (вопросы заказа, разумеется)
- Разрешите писать достаточно времени для проведения каждой записи (скажем, 5 секунд), в какой момент просто залог
- Если запись идет медленно, Исполнитель должен собрать записи в очереди и подождать.
- Не разрешайте общей программе выйти до тех пор, пока очередь потоков не будет пуста.
- Отделите темы писателями. I.e., если в эту функцию входит тот же самый точный автор, поместите его в свою очередь. Если появляется другой указатель писателя, укажите его собственную очередь (нет необходимости помещать отдельных писателей в одну очередь).
Я считаю, что это может быть сделано с комбинацией исполнителя особенности вместе с командой .wait()
и .notify()
на объекте главной программы. Тем не менее, я просто не уверен, как точно работать с API-интерфейсом исполнителя, чтобы это сделать.
Вот что я получил:
private void writeToFileInSeperateThread(final PrintWriter writer, final String text) {
ExecutorService executor = Executors.newSingleThreadExecutor();
try {
executor.submit(new Thread(new Runnable() {
public void run() {
writer.println(text);
}
})).get(5L, TimeUnit.SECONDS);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
}
Этот метод будет вызван 100k + раз в течение одного процесса, так что я не уверен, если я должен создать новую ExcutorService
экземпляру каждый раз, или используют тот самый? (В моих попытках использовать тот же один, я постоянно получаю исключения, которые я считаю, были связаны с .newSingleThreadExecutor()
директивы.
хотел бы остаться Java 5 уступчивый, но Java 6 хорошо. Работает на Windows XP/7.
Update: Это, кажется, сделал трюк в первоначальном тестировании:
private class WriterStringPair {
public final PrintWriter writer;
public final String text;
public WriterStringPair(PrintWriter writer, String text) {
this.writer = writer;
this.text = text;
}
}
private void writeTextInSeperateThread(Writer writer, String text) {
try {
textQueue.offer(new WriterStringPair(writer, text), 300L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
errOut.println(e);
e.printStackTrace();
}
}
final BlockingQueue<WriterStringPair> textQueue = new ArrayBlockingQueue<WriterStringPair>(500);
private void setWritingThread() {
new Thread((new Runnable() {
public void run() {
WriterStringPair q;
while (!shutdown && !Thread.currentThread().isInterrupted()) {
try {
q = textQueue.poll(1L, TimeUnit.SECONDS);
if (q != null) {
q.writer.write(q.text + "\n");
q.writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
})).start();
}
Вы говорите, что файл пишет по сети. Вы говорите о NFS или что-то в этом роде? Вы можете рассмотреть возможность использования sftp или более лучших протоколов, которые могут улучшиться по сравнению с «flaky» сетью. – Gray
NFS - это то, что я застрял с ... –