Форум программистов, компьютерный форум CyberForum.ru

Потоки (Handler внутри synchronized) - Android

Восстановить пароль Регистрация
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 69
29.05.2015, 16:05     Потоки (Handler внутри synchronized) #1
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private Handler Ocnova = new Handler();
private Object sync = new Object();
 
class newThread extends Thread {
//...String mes.....
//...
   public void run() {
      while(true) {
         //.. socket.read(); // ждем пока не получим mes
         if("start".compareTo(mes) == 0) {
            synchronized(sync) {
               Ocnova.post(new Potok4(this, mes));
               try {sync.wait(); } catch (InterruptedException e) {  }
            }
         }
         else if("stop".compareTo(mes) == 0) {
            break;
         }
      }
   }
}
 
//GUI-Thread
//...
class Potok4 implements Runnable {
   private newThread threadNEW = null; private String mes = null;
   public Potok4(newThread threadNEW, String mes) {this.mes = mes;}
   //...
   synchronized(sync) {
      //...
      txt.setText(mes);
      sync.notify();
   }
}
Потоков newThread может быть очень много, поэтому synchronized. При отправки из newThread Handler-а, в Runnable(Potok4) выполняется не все, что там находится. Например setText срабатывает на раз. При этом, если поток newThread выходит из run(), все, что было внутри Potok4 тут же срабатывает (все тексты отображаются). Из-за чего такое может быть? Можно ли внутри synchronized вызывать Handler? Как быть, если нужно синхронизированно обращаться из других потоков к методам, которые работают только в gui-потоке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Welemir1
Мечтатель
 Аватар для Welemir1
304 / 280 / 94
Регистрация: 30.03.2015
Сообщений: 1,229
29.05.2015, 16:13     Потоки (Handler внутри synchronized) #2
Я верно понимаю, что у вас некая графическая форма есть в программе, возможно даже Свинг, в которой элементы не отображаются когда должны, но прорисовываются, когда заканчивается определенный поток?
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 69
29.05.2015, 16:18  [ТС]     Потоки (Handler внутри synchronized) #3
Да, когда с gui-потока меняешь форму, все отображается, а вот с др. потока, если обращаться как я указал в коде иногда отображает, иногда нет. Когда заканчивается поток, всегда отображает все, что должно.
В примере я забыл в Potok4 добавить run(), но он там есть.
Welemir1
Мечтатель
 Аватар для Welemir1
304 / 280 / 94
Регистрация: 30.03.2015
Сообщений: 1,229
29.05.2015, 16:23     Потоки (Handler внутри synchronized) #4
это все из-за правила единственного потока для Свинг. Нужно все изменения формы и саму форму рисовать в основном диспетчере потоков (а не в созданных новых потоках), вычисления же и прочее вести в других потоках. Изменения формы производить не просто присваиванием, а через invokeLater, так нормально отрабатывает. Хотя сами производители указали что Свинг не потокобезопасен.
Тем не менее, моя программа выполненная по этому правилу вполне себе работает и к примеру в выпадающий список выдает подключившихся юзеров и убирает отключившихся без проблем в отображении.
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 69
29.05.2015, 16:37  [ТС]     Потоки (Handler внутри synchronized) #5
Я пишу под android, а там вроде нет свингов?
Welemir1
Мечтатель
 Аватар для Welemir1
304 / 280 / 94
Регистрация: 30.03.2015
Сообщений: 1,229
29.05.2015, 17:03     Потоки (Handler внутри synchronized) #6
я же тебя спросил про свинг))) тогда беру свои слова назад)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 18:53     Потоки (Handler внутри synchronized)
Еще ссылки по теме:

Android Не работает Handler
Android Модификатор synchronized и Runnable
Android Handler
Android Handler
Android Handler при пересоздании активити

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

Или воспользуйтесь поиском по форуму:
Паблито
не спать!
1874 / 1608 / 496
Регистрация: 12.05.2014
Сообщений: 5,810
Завершенные тесты: 1
29.05.2015, 18:53     Потоки (Handler внутри synchronized) #7
я может как обычно невнимательно прочитал код, но все логично - захватили монитор, внутри блока запустили новый Thread, который ждет пока монитор освободят
Yandex
Объявления
29.05.2015, 18:53     Потоки (Handler внутри synchronized)
Ответ Создать тему
Опции темы

Текущее время: 22:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru