Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
1

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

29.05.2015, 16:05. Просмотров 539. Ответов 6
Метки нет (Все метки)

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-потоке?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 16:05
Ответы с готовыми решениями:

Модификатор synchronized и Runnable
Имеется сервис в котором крутится поток работающий с сетью, проблема в том, что...

Handler
import android.app.Activity; import android.os.Bundle; import...

Handler
Вот допустим обьект Handler был создан в активити(то есть в главном потоке). И...

Не работает Handler
Я нахожусь на 66 уроке startandroid, здесь упоминается Handler. Почему то...

Handler timer
Добрый вечер. С помощью какого метода в Handler...

6
Welemir1
Автоматизируй это!
844 / 573 / 234
Регистрация: 30.03.2015
Сообщений: 2,213
29.05.2015, 16:13 2
Я верно понимаю, что у вас некая графическая форма есть в программе, возможно даже Свинг, в которой элементы не отображаются когда должны, но прорисовываются, когда заканчивается определенный поток?
0
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
29.05.2015, 16:18  [ТС] 3
Да, когда с gui-потока меняешь форму, все отображается, а вот с др. потока, если обращаться как я указал в коде иногда отображает, иногда нет. Когда заканчивается поток, всегда отображает все, что должно.
В примере я забыл в Potok4 добавить run(), но он там есть.
0
Welemir1
Автоматизируй это!
844 / 573 / 234
Регистрация: 30.03.2015
Сообщений: 2,213
29.05.2015, 16:23 4
это все из-за правила единственного потока для Свинг. Нужно все изменения формы и саму форму рисовать в основном диспетчере потоков (а не в созданных новых потоках), вычисления же и прочее вести в других потоках. Изменения формы производить не просто присваиванием, а через invokeLater, так нормально отрабатывает. Хотя сами производители указали что Свинг не потокобезопасен.
Тем не менее, моя программа выполненная по этому правилу вполне себе работает и к примеру в выпадающий список выдает подключившихся юзеров и убирает отключившихся без проблем в отображении.
0
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
29.05.2015, 16:37  [ТС] 5
Я пишу под android, а там вроде нет свингов?
0
Welemir1
Автоматизируй это!
844 / 573 / 234
Регистрация: 30.03.2015
Сообщений: 2,213
29.05.2015, 17:03 6
я же тебя спросил про свинг))) тогда беру свои слова назад)
0
Pablito
2767 / 2198 / 744
Регистрация: 12.05.2014
Сообщений: 7,719
Завершенные тесты: 1
29.05.2015, 18:53 7
я может как обычно невнимательно прочитал код, но все логично - захватили монитор, внутри блока запустили новый Thread, который ждет пока монитор освободят
0
29.05.2015, 18:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 18:53

Handler vs Service vs AsynkTask
Есть 2 Activity, пусть A1 и A2. В методе onCreate() Activity A1 запускается...

Handler и интервал времени
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable...

Про Handler и ProgressBar
Есть 2 кнопки - Start и Stop, соответственно запуск и остановка прогресса в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru