2013-12-19 2 views
0

Я использую Java.Порядок выполнения функций (многопоточность)

У меня есть основная функция и функция f(). Тема создается в f(), но для выполнения других операций в f() требуется больше времени. Каков истинный порядок столичных писем?

main() { 
    operations A; 
    f(); 
    operations B; 
} 

f() { 
    C; 
    final Thread thread = new Thread() { 
     @Override 
     public void run() { 
      many operations, more than B+D; 
      E; 
     } 
    }; 
    thread.start(); 
    D; 
} 

Как я могу убедиться, что заказ A-C-D-B-E?

+0

Задайте вопрос о домашнем задании/задании. –

ответ

1

Вы используете переменную условия, чтобы гарантировать, что какой-либо код не будет запущен до уведомления. Если предположить, что вся процедура выполняется только один раз,

volatile boolean canGoOn = false; 
final Object condition = new Object(); 

// in main: 
B; 
synchronized (condition) { 
    canGoOn = true; 
    condition.notify(); 
} 

// in thread: 
synchronized (condition) { 
    while (!canGoOn) { 
     condition.wait(); 
    } 
} 
E; 

(Не тестировался, вам может понадобиться, чтобы наловить InterruptedException.)


BTW Если вы используете Android вся эта идиома упакована в android.os.ConditionVariable класс, который вам нужно только .open() он в основном и .block() он в нитке.

+0

Вам нужно будет использовать 'synchronized (condition)' around 'wait' /' notify' вызовы. – Tudor

+0

@Tudor: Спасибо, добавил. – kennytm

+0

Кроме того, рекомендуется также создавать объекты синхронизации «final» и, возможно, объявлять 'canGoOn' как' volatile', но это nitpicks. – Tudor

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