Java потокобезопасные последовательные вызовы методов - PullRequest
0 голосов
/ 16 февраля 2012

Как я могу отредактировать следующий код так, чтобы в clearAndSave () метод save () всегда запускался после того, как clear () завершает свою работу.

Метод clear () и save () использует объект, который создает новый поток.

public class Test {
     public void clearAndSave() {
         clear();
         save();
     }

     private void clear(){
         // Deletes everything from DB.
     }

     private void save(){
         // Adds new data into DB.
     }
}

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Он всегда будет работать таким образом, потому что команды clear и save выполняются в одном потоке. Вы не создаете новую тему и не вызываете одну из них из новой темы или чего-то в этом роде. Если вы хотите, чтобы все прекратилось до тех пор, пока они оба не запустятся, вы должны сделать:

synchronized(this) {
    clear();
    save();
}
1 голос
/ 16 февраля 2012

Без использования потоков невозможно добиться этого эффекта, если вы не измените код потоков и не используете какой-либо механизм, заставляющий второй поток ждать, пока первый не будет завершен. Вы можете передать ссылку на поток A в поток B, а из B вызвать A.join, или вы можете создать экземпляр Semaphore или CountDownLatch и передать их потокам, или создать свой собственный механизм с помощью wait-notify.

Это, однако, сделает ваш код более сложным. Если вам не нужен параллелизм, избавьтесь от потоков.

1 голос
/ 16 февраля 2012

Если ни clear (), ни save () не создают новые потоки, они всегда будут выполняться последовательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...