2

Я ищу лучшее решение для обмена данными между двумя различными потоками. Я уже написал собственное решение, но мне очень интересно слушать чужие мысли.Обмен данными между двумя потоками в java

Сценарий следующий: Основной поток запускает 2 разных потока, которые работают вместе одновременно.

Первый (Reader) должен считывать значения из источника InputStream, а затем хранить их в объекте java bean.

Второй (Отправитель), каждые X секунд должен получать значения из предыдущего java-объекта и отправлять их в веб-службу.

Основная особенность сценария заключается в том, что объект должен использоваться совместно «в режиме реального времени». Я имею в виду:

Источник InputStream, о котором я упоминал выше, не имеет конца. Чтение чтения без остановки из этого источника и обеспечивает обновление экземпляра общего объекта с новыми считанными значениями. Отправитель, каждый х секунд, должен принять «моментальный снимок» объекта для отправки его в веб-службу.

По этой причине я считаю, что шаблон Продюсер/Потребитель не подходит для меня, потому что поток производителя не может создать «полный» объект, но он может постоянно обновлять один и тот же файл.

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

Каково ваше решение?

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

+0

Не могли бы вы опубликовать свое решение в первую очередь? –

+0

http://stackoverflow.com/search?q=%5Bjava%5D+Share+data+between+two+threads+in+java – MadConan

+0

извините, но я не могу опубликовать свой код, потому что является собственностью моей компании. – wyr0

ответ

2

Для такого типа шаблона производителя/потребителя, учитывая высокую конкуренцию, но небольшую работу с общим ресурсом, как правило, лучше записывать циклы процессора с помощью цикла CAS типа spin-lock, чем решение, которое включает в себя приостановку потоков и контекстные переключатели, поскольку объем работы, производимой производителем/потребителем, настолько мал, что почти нет времени на доступ к общему ресурсу (просто нажмите/поп из общей очереди или прочитайте/напишите из потока ввода в вашем случае).

Таким образом, вы не обязательно хотите использовать синхронизированные здесь методы Java, что может привести к повторному приостановке потоков, чтобы разбудить их сразу же после того, как повторная приостановка потока и контекст переключится в узкое место.

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