Несколько потоков записи файлов - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь обработать несколько команд записи файлов (для разделения файлов) без зависания пользовательского интерфейса.

Чтобы поставить мой вопрос в контексте, представьте следующее

  1. Мое основное приложение выглядит как файловый менеджер. В настоящее время он видит 10 файлов каждый размером около 5 МБ. (Не беспокойтесь о том, как работает этот список и т. Д.)

  2. Когда я выбираю один элемент файла, я хочу, чтобы он немедленно начал копировать / дублировать файл в другое место на SD-карте. Обычно это занимает несколько секунд

  3. Я хочу иметь возможность выбрать второй или третий файл и т. Д. Сразу после первого. В конце концов, все файлы, которые я выбрал, будут продублированы. Так что я могу, например, щелкнуть 5 файлов в течение 5 секунд, но все действия по копированию занимают минуту.

На данный момент мне на ум пришло два варианта:

Первое - просто поместить команды записи файлов каждого файла в отдельный поток. Псевдокод будет выглядеть так

Onclick
   new Thread()
      write file

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

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

Ответы [ 3 ]

1 голос
/ 05 января 2012

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

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

0 голосов
/ 04 января 2012

Я думаю, что классы в java.util.concurrent - это то, что вам нужно;в частности класс Executors для создания ThreadPoolEecutor .Преимущество заключается в том, что пользователь принимает столько задач, сколько щелкает пользователь, но ограничивая количество потоков до указанного вами ограничения.(Создание потоков без ограничений может быть проблемой, замедляя не только друг друга, но и пользовательский интерфейс.)

0 голосов
/ 04 января 2012

Я бы создал класс AsyncTask, который просто копирует данный файл. Каждый раз, когда файл выбран, создайте новый экземпляр этого класса для выбранного файла. Управление потоками, встроенное в Android для AsyncTask, хорошо сбалансировано и должно хорошо справляться с этим вариантом использования. Будет легко обеспечить обратную связь для прогресса и завершения, используя встроенные методы AsyncTask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...