2013-12-13 2 views
1

У меня есть приложение, в котором я начинаю несколько потоков, каждый с одним подмодулем. После запуска потока подмодуль инициализируется и запускается.Ожидание инициализации подмодулей в Android

public class MySubmoduleThread extends Thread { 
    ... 
    private MySubmodule mSubmodule; 
    ... 
    @Override 
    public final void run() { 
     mSubmodule.initialize(); 
     mSubmodule.run(); 
    } 
} 

Эти темы начинаются по применению onCreate. Каков простой способ подождать, пока все подмодули не будут инициализированы?

public class MyApp extends Application { 
    ... 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     ... 
     mSubmoduleThread1.start(); 
     mSubmoduleThread2.start(); 
     ... 
     mSubmoduleThreadN.start(); 
     --> waitSomehowUntilAllSubmodulesAreInitialized 
     ... 
    } 

Конечно, я могу редактировать MySubmoduleThread код для добавления что-то между mSubmodule.initialize(); и mSubmodule.run();.

ответ

1

Рассмотрите возможность не ждать. Блокировка основного потока - не очень хорошая идея. Место, которое использует подмодули, может, вероятно, получить доступ к ним асинхронно и ждать, если это необходимо.

В противном случае используйте CountDownLatch, Semaphore, .. из пакета java.util.concurrent.

public class MySubmoduleThread extends Thread { 
    ... 
    private MySubmodule mSubmodule; 
    private CountDownLatch mLatch; // shared latch object accross tasks 
    public MySubModuleThread(CountDownLatch latch) { 
     mLatch = latch; 
    } 
    ... 
    @Override 
    public final void run() { 
     mSubmodule.initialize(); 
     mLatch.countDown(); // count 1 down 
     mSubmodule.run(); 
    } 
} 

public class MyApp extends Application { 
    ... 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     int nrOfTasks = /* N */; 
     CountDownLatch latch = new CountDownLatch(nrOfTasks); 
     mSubmoduleThread1 = new SubModuleThread(latch); 
     mSubmoduleThread2 = new SubModuleThread(latch); 
     ... 
     mSubmoduleThread1.start(); 
     mSubmoduleThread2.start(); 
     ... 
     mSubmoduleThreadN.start(); 

     latch.await(); // wait that countdown reaches 0 (needs some try catch) 

    } 
Смежные вопросы