3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
1

Синхронизация между потоками

16.05.2016, 13:03. Показов 952. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот, например у меня есть основной Ui поток и поток Thread который он породил. И Tread меняет какую то переменную (ну или массив целый) и я хочу, чтобы об этих измениях узнал Ui поток. Ну понятно есть механизмы Handler там Broadcast и прочее. А как нибудь без них можно например обьявить переменную volatile там, опрашивать ее состояние через определенный промежуток времени в Ui потоке(ну там средства синхронизации могут помочь)? В ручную как нибудь можно это сделать без Handler, Broadcast там? или не стоит заморачиваться?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2016, 13:03
Ответы с готовыми решениями:

Передача данных между потоками
Всем доброго времени суток. В общем есть приложение, которое парсит сайт с музыкой, добавляет...

EventBus и обмен событиями между потоками
Допустим у меня есть один фоновый thread и второй. Могу ли я через eventBus послать event из...

Синхронизация данных приложения между устройствами
Здравствуйте! Необходимо осуществить синхронизацию данных приложения на разных устройствах...

Синхронизация итераций между потоками
Добрый день. Сразу скажу, что облазил все доступные мне офф. доки по Qt и полгугла, но не нашел...

18
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
16.05.2016, 18:16 2
yura91, можно все что угодно я к примеру делаю хандлер который раз в 0.5 с проверяет флажок сигнализирующий о завершении обработки
0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
16.05.2016, 18:37  [ТС] 3
Ну это же handler а на уровне Thread как подобное можно реализовать?
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.05.2016, 18:52 4
yura91, слова "опрашивать с периодом времени" обычно наталкивают на мысль об ошибках проектирования. ИМХО, правильнее было бы callback
2
Pablito
16.05.2016, 19:02
  #5

Не по теме:

я несколько раз начинал писать сообщение про callback-и и observable поля, но останавливался )

0
3 / 27 / 2
Регистрация: 23.10.2013
Сообщений: 2,331
16.05.2016, 19:11  [ТС] 6
Паблито, а можете хотя бы сейчас написать про эти поля? Мне бы интересно было бы узнать о них?
1
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.05.2016, 19:17 7
Цитата Сообщение от YuraAAA Посмотреть сообщение
правильнее было бы callback
я тоже так думаю

Цитата Сообщение от yura91 Посмотреть сообщение
Мне бы интересно было бы узнать о них
https://www.google.com.ua/sear... observable
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
16.05.2016, 19:53 8
Цитата Сообщение от YuraAAA Посмотреть сообщение
наталкивают на мысль об ошибках проектирования
карандаш работает и это гут) в свое время пытался найти серебряную пулю от того что из потока нельзя позвать форму. остановился на постоянно жужащем хандлере как на решении которое здесь и сейчас будет работать просто потому что там как то так и написано - для передачи используйте хандлер. так на том и остался. читал что то тут про обсервы и даже в свое время был восхищен но что то заставило оставить все как есть. видимо были причины не вспомнить уже)
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
16.05.2016, 20:05 9
вся суть этих обсерверов - слушатели
тупо в класс передается ссылка на слушателя
как только рассчеты окончены - на слушателе дергается какой-то метод
и все )
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
16.05.2016, 20:30 10
Паблито, это же андроид там все просто и все сложно в свое время мне половину головы оторвало только лишь от того что активити пересоздавалось из за поворота экрана или вообще из за того что так захотелось системе
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.05.2016, 23:46 11
vxg, Event Driven!

1. тред
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SomeThread implements Runnable {
 
    private boolean changeableVariable;
 
    private void setChangeableVariable(boolean changeableVariable) {
        this.changeableVariable = changeableVariable;
        EventBus.getDefault().postSticky(changeableVariable);
    }
 
    @Override
    public void run() {
        for (;;) {
             setChangeableVariable(new Random().nextBoolean());
        }
    }
}
2. UI
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class TargetActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Executors.newSingleThreadExecutor().submit(new SomeThread());
    }
 
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void onBooleanVariableChanged(boolean data) {
        
    }
}
На пересоздание активити - наплевать
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2016, 07:37 12
Цитата Сообщение от YuraAAA Посмотреть сообщение
На пересоздание активити - наплевать
модельная ситуация. создается активити, запускается поток, в потоке так или иначе сохраняется ссылка на активити для обратного вызова при завершении задачи. система убивает активити (например от поворота экрана или потому что ей так захотелось может памяти мало или еще чего - не знаю правда может ли она выгружать отдельные активити при нехватке без выгрузки приложения но не в этом суть) - система "убивает" ее, но на самом деле убить не может так как на нее есть ссылка из потока. после поворота экрана создается новое активити + у нас остается активити-зомби в которое придет обратный вызов и непонятно что там сделает с контролами-трупами...
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.05.2016, 10:01 13
про пересоздание активити я уже писал - пересоздание можно отключать в манифесте
оно реально нужно только если для разных ориентаций используются разные файлы разметки, в этом случае пересоздание требуется что бы отработал onCreate вместе с setContentView()

даже если пересоздание было, спасают разные лоадеры, которые отслеживают изменение контекста
или вообще делать на ивентах
1
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
17.05.2016, 10:44 14
vxg, в моём примере нет этой ситуации. Правда, я забыл кое что)
В активити
onPause -> EventBus.getDefault().unregister(this);
onResume -> EventBus.getDefault().register(this);

Цитата Сообщение от Паблито Посмотреть сообщение
или вообще делать на ивентах
Вот вот
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2016, 13:04 15
Цитата Сообщение от Паблито Посмотреть сообщение
пересоздание можно отключать в манифесте
а что про убийство из за ресурсов? не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7

Добавлено через 2 минуты
Цитата Сообщение от YuraAAA Посмотреть сообщение
забыл кое что
да, теперь гораздо лучше. в моем велосипеде тоже хандлер стартует только когда запускается поток и останавливается если обнаружил что поток отработал или при паузе активити с последующем стартом при возобновлением если статическая переменная хранящая флаг отработки еще не выставлена. а на эвентах чем отличается от обратных вызовов?
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
17.05.2016, 14:45 16
vxg, статичные переменные это не самый лучший вариант. Слушателей эвентов может быть много.
Цитата Сообщение от vxg Посмотреть сообщение
не в курсе может ли система не закрыв приложение убить одну из его фоновых активностей7
Может, если она не видна. Но если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты.
1
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.05.2016, 14:50 17
Цитата Сообщение от YuraAAA Посмотреть сообщение
статичные переменные это не самый лучший вариант
в описанном велосипеде это самое то
Цитата Сообщение от YuraAAA Посмотреть сообщение
если у Вас в приложении много активити, это опять же повод задуматься о неверной архитектуре и о переходах на фрагменты
я бы даже сказал: если у вас в приложении активити, это повод задуматься тем ли вы заняты)
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
17.05.2016, 14:51 18
vxg,
Цитата Сообщение от vxg Посмотреть сообщение
если у вас в приложении активити, это повод задуматься тем ли вы заняты)
в смысле?)
0
vxg
17.05.2016, 14:53     Синхронизация между потоками
  #19

Не по теме:

Цитата Сообщение от YuraAAA Посмотреть сообщение
в смысле?)
в смысле андроид это конечно хорошо но комбайн в сарае и станок в цеху ржавеют

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2016, 14:53

Синхронизация ресурса между потоками
Всем привет!) Возник вопрос.. незнаю как его решить.. Предположим есть класс A, с числовой...

Lock-free синхронизация: как организуется нотификация между потоками?
Добрый день! Хотелось бы услышать о реальном опыте, потому что теоретических советов в гугле...

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

Взаимодействие между потоками
Привет. Есть класс А, который содержит не статические методы, которые можно вызвать лишь с главного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru