В принципе, существует два основных подхода к взаимодействию потоков:
- Общая память
- Событие / очередь на основе
В подходе с разделяемой памятью вы можете создать синхронизированный список или синхронизированную карту, из которой оба потока могут читать и записывать. Как правило, есть некоторые издержки, чтобы убедиться, что чтение и запись происходят без конфликтов, например, вы не хотите, чтобы объект, который вы читаете, был удален во время чтения. Java предоставляет коллекции, которые хорошо себя ведут, как Collections.synchronizedMap
и Collections.synchronizedList
.
В случае событий или потоков, связанных с потоками, потоки имеют входящие очереди и записывают их во входящие очереди других потоков. В этом сценарии у вас может быть поток пульса, загружающий очередь с клиентами для чтения, и другой поток запрашивает / извлекает из этой очереди и выполняет его обработку. Поток пульса может непрерывно добавлять в эту очередь клиентов, которые находятся в действии, чтобы поток обработки "знал", чтобы продолжить их обработку.