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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
rugga
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 71
#1

Потоки (Handler внутри synchronized) - Программирование Android

29.05.2015, 16:05. Просмотров 433. Ответов 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-потоке?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потоки (Handler внутри synchronized) (Программирование Android):

Модификатор synchronized и Runnable - Программирование Android
Имеется сервис в котором крутится поток работающий с сетью, проблема в том, что при некоторых(больше месяца пытаюсь понять каких)...

Handler - Программирование Android
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import...

Handler - Программирование Android
Вот допустим обьект Handler был создан в активити(то есть в главном потоке). И мы запускаем через этот Handler (его метод post) кусок кода...

Handler timer - Программирование Android
Добрый вечер. С помощью какого метода в Handler http://developer.android.com/reference/android/os/Handler.html(беда пока с английским) ,...

Не работает Handler - Программирование Android
Я нахожусь на 66 уроке startandroid, здесь упоминается Handler. Почему то отсутствуют у меня методы, которые описываются тут. Вот фрагмент...

Про Handler и ProgressBar - Программирование Android
Есть 2 кнопки - Start и Stop, соответственно запуск и остановка прогресса в ProgressBar, запуск каждый раз идет с нуля. Если нажать...

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

Handler vs Service vs AsynkTask - Программирование Android
Есть 2 Activity, пусть A1 и A2. В методе onCreate() Activity A1 запускается новый поток, в котором определяются координаты местоположения...

Handler и интервал времени - Программирование Android
Создаю хэндлер: Handler h = new Handler(); h.post(obrtimer); Runnable obrtimer = new Runnable() { public void run() { ...

Handler, поток не останавливается - Программирование Android
Добрый вечер. Не могу остановить таймер, при переходе на другую Activity. Возможно ли это вообще? Code: mport...

Handler при пересоздании активити - Программирование Android
У меня есть поток Thread, который запускается во фрагменте и получает ссылку на изображение с сервера(парсит JSON выделяет ссылку). И...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.05.2015, 18:53
Ответ Создать тему
Опции темы

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