Канал для обмена данными между потоками - PullRequest
1 голос
/ 08 февраля 2012

У меня есть требование, где мне нужно прочитать текстовый файл, затем преобразовать его и записать в другой файл.Я хочу сделать это параллельно, например, один поток для чтения, один для преобразования и другой для записи.Теперь, чтобы обмениваться данными между потоками, мне нужен какой-то канал, я подумал использовать для этого BlockingQueue, но хотел бы изучить некоторые другие (лучшие) альтернативы, если таковые имеются.Guava имеет EventBus, но не уверен, подходит ли он для этого требования.Какие есть альтернативы и какая из них лучше с точки зрения производительности.

1 Ответ

2 голосов
/ 08 февраля 2012

Если ваш шаг преобразования не является действительно интенсивным, это, вероятно, пустая трата времени.

Подумайте об этом так.Что вы просите?

Вы запрашиваете что-то, что

  • Принимает входящий поток данных
  • Копирует его в другой поток
  • Представляет это потоку как входящий поток данных

Какая структура данных лучше всего представляет входящий поток данных для шага 3?(Подсказка: это InputStream, с которого вы начали!)

Какое значение добавляют первые два шага?Поток "transform" может читать с диска так же быстро, как и с диска через другой поток.Добавление потока между ними не ускоряет чтение с диска.

Вы могли бы начать добавлять другой поток, когда

  1. Ваша проблема может быть полезной разделены на независимые части работы (скажем, каждый поток работает с фрагментом текста
  2. Стоимость разделения задачи на эти части работы значительно меньше , чем накладные расходыдобавление дополнительного потока и координация между ними (что мало, но не бесплатно!)
  3. Проблема требует больше ресурсов, чем может обеспечить один процессор (поток дает вам доступ к большему количеству ресурсов процессора, но необеспечивает большую ценность с точки зрения пропускной способности ввода / вывода)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...