Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Синхронизация thread


Автор: Spegulo 21.6.2009, 17:19
Всем привет.
Есть код
Код

gRegistry.gServerSearch = new BlueSearcher();
        gRegistry.gServerSearch.start();
        gRegistry.gFoundServers = gRegistry.gServerSearch.getServices();        
        if (gRegistry.gFoundServers != null)
        ....

Подскажите, плиз, как мне дождаться окончания отработки метода gRegistry.gServerSearch.getServices()?
Он заполняет массив найденных bluetooth-устройств, но на практике отрабатывает только первый добавленный элемент.
Библиотечка взята из статьи 
http://www.mobilab.ru/articles/102/
На сколько я понимаю, тут нужно каким-то образом приостановить основной поток, но как это сделать я не знаю.

Автор: W0LF 22.6.2009, 01:11
Библиотеку не видел, думаю, че там должен быть метод, который возвращает флаг завершения потока. без него никак, разве что добавить флаг туда, если возможно.
Способов много остановить тред. Начиная от того, что поставить while на проверку того самого метода, заканчивая waitом
можно поставить Thread.sleep() чтоб подождать некоторе время.
синхронизацию можно сделать так, но должна быть возможность коллбека, который сможет вызвать тот другой поток, так как этот будет спать - 
Код

static final Object objectMonitor = new Object();
boolean searchingDone = false;
....
gRegistry.gServerSearch = new BlueSearcher();
        gRegistry.gServerSearch.start();
        gRegistry.gFoundServers = gRegistry.gServerSearch.getServices();        
        
        while (!searchingDone) {
                synchronized(objectMonitor) {
                    try { 
                          objectMonitor.wait(); 
                   } catch (InterruptedException e) {  }
                }
        }
...
      //а вот это тот самый коллбэк, который будит этот поток
     public void doneSearching()
     {
       synchronized(objectMonitor)
       {
         searchingDone = true;
         objectMonitor.notify();
       }
     }
....

Если же такой возможности нет - Thread.sleep() на некоторое время или же то, что ударит по перформансу - while с условием.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)