Android Thread Параллельно запущенные потоки уведомляют между собой - PullRequest
3 голосов
/ 29 февраля 2012

Я хочу выполнить метод uploadingDone() после завершения всех трех потоков. Флаги работают в большинстве случаев правильно. В редких случаях все три флага устанавливаются в true и BLOCK1 выполняются дважды. Все три потока выполняют разные задачи для разных данных (одновременное изменение не может происходить).

Могу ли я удалить флаги с любой встроенной функцией в потоке?

Все три потока должны выполняться параллельно (Обязательное требование.). BLOCK1 следует вызывать только один раз .

private synchronized void uploadingDone(){

    if( isItemUploaded && isListUploaded && isStoreUploaded){
        uploadingDone = true;
         //<BLOCK1>
        //TODO move to next screen
    }else{
        Log.i(TAG, "uploadingDone: Failed");
    }
}

private boolean isListUploaded = false, isItemUploaded = false, isStoreUploaded = false, uploadingDone = false;


private class ListUpload extends Thread{

    @Override
    public void run() {
        isListUploaded = true;
        Log.i(TAG, "ListUpload Thread started");
        if(!uploadingDone)
            uploadingDone();
    }

}

private class ItemUpload extends Thread{

    @Override
    public void run() {
        Log.i(TAG, "ItemUpload Thread started");
        isItemUploaded = true;
        if(!uploadingDone)
            uploadingDone();
    }
}

private class StoreUpload extends Thread{

    @Override
    public void run() {
        Log.i(TAG, "StoreUpload Thread started");
        isStoreUploaded = true;
        if(!uploadingDone)
            uploadingDone();
    }

}

private ListUpload listUpload;
private StoreUpload storeUpload;
private ItemUpload itemUpload;

public void startUpload(){

    listUpload = new ListUpload();
    listUpload.start();

    storeUpload = new StoreUpload();
    storeUpload.start();

    itemUpload = new ItemUpload();
    itemUpload.start();

}

Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Пропустите флаги и добавьте

listUpload.join();
storeUpload.join();
itemUpload.join();
// <BLOCK1>

в конце startUpload ().Каждый вызов join () будет вызывать блокировку вызывающего потока до тех пор, пока данный поток не завершится.

0 голосов
/ 02 марта 2012

Я изменил свой источник, как упомянул claesv. Я публикую свой результирующий код, чтобы показать, как этот метод Thread.join упростил мою задачу. Надеюсь, кому-то поможет.

private void uploadingDone(){

if( isItemUploaded && isListUploaded && isStoreUploaded){
    uploadingDone = true;
     //<BLOCK1>
    //TODO move to next screen
}else{
    Log.i(TAG, "uploadingDone: Failed");
    showFailureAlert();
}
}

// These flags are used to VALIDADTION success of uploading process. No need if you no need validation to move screen.

private boolean isListUploaded = false, isItemUploaded = false, isStoreUploaded =   false, uploadingDone = false;


private class ListUpload extends Thread{

@Override
public void run() {
    isListUploaded = true;
    Log.i(TAG, "ListUpload Thread started");
}

}

private class ItemUpload extends Thread{

@Override
public void run() {
    Log.i(TAG, "ItemUpload Thread started");
    isItemUploaded = true;
}
}

 private class StoreUpload extends Thread{

@Override
public void run() {
    Log.i(TAG, "StoreUpload Thread started");
    isStoreUploaded = true;
}

}

private ListUpload listUpload;
private StoreUpload storeUpload;
private ItemUpload itemUpload;

public void startUpload(){

listUpload = new ListUpload();
listUpload.start();

storeUpload = new StoreUpload();
storeUpload.start();

itemUpload = new ItemUpload();
itemUpload.start();

listUpload.join();
storeUpload.join();
itemUpload.join();

//Here comes the final block to execute after all threads finished
uploadingDone();

}

ПРИМЕЧАНИЕ: не помещайте thread.join () после немедленного thread.start () Учтите это:

t1.start();
t2.start();
t3.start();
t4.start();

t1.join();
t2.join();
t3.join();
t4.join();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...