Вопрос в том, как взаимодействовать с собственным потоком потокозащищенным способом.
Я могу заставить выполнить мой поток некий код (поместив его в методе класса расширяющего Thread), и вызвать этод метод из другого потока. Проблем в том, что этот метод будет выполнен всеравно в том потоке в котором он вызван.
Смотри, если у моего потока-класса есть метод doLyalya(), то если я просто вызовы этот метод из главного UI потока, то и обрабатываться он будет в главном потоке, а не в кастомном. Если передавать сообщения (или их подобие) через переменные или флаги, то возможны варианты, когда один поток будет устанавливать эти переменные, а другой считывать. В этом случае возможны повреждения целостности данных. Например есть поля "Name" и "Email". Теперь один поток устанавливает значения, а второй их считывает. Что произойдет, если второй поток считает данные между тем, как первый поток будет их устанавливать. Т.е. второй поток считает оба поля после того, как первый установит первое, но перед тем, как он же установит второе поле.
Код: Выделить всё
// установка значений
name="Vasya";
email ="vasya@gmail.com";
Получается, что считывающий поток получит новое значение "name" и старое значение "email".
По стандарту данная пробема должна решаться через synchronized. Проблема в том, что блокировать основной поток нельзя!!!! поэтому нельзя делать сеттер потокозащищенным с помощью оператора synchronized.
Вот если бы можно было ложить сообщения в очередь, а потом в нужном потоке эти сообщения из неё забирать, было бы то, что надо. Handler использует такую очередь, но она использует нативную синхронизация, которая не блокирует потоки. В java же такую синхронизацию сделать нельзя своими силами.