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