Могут ли потоки взаимодействовать друг с другом

«Могут ли потоки взаимодействовать друг с другом» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, потоки могут взаимодействовать через общие ресурсы (память, файлы) или механизмы синхронизации. Основные способы:

  1. Общая память - потоки имеют доступ к одним и тем же объектам/переменным. Требуется синхронизация:
var counter = 0
synchronized(this) {
    counter++
}
  1. Handler/Looper - отправка сообщений между потоками:
val handler = Handler(Looper.getMainLooper())
thread {
    handler.post { updateUI() }
}
  1. Корутины - более современный способ с Channel/Flow:
val channel = Channel<Int>()
launch { channel.send(42) }
launch { println(channel.receive()) }
  1. BlockingQueue - потокобезопасные коллекции

Важно синхронизировать доступ к общим данным, чтобы избежать race conditions и deadlock. Для UI-операций обязательно использовать главный поток.