2012-02-16 2 views
0

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

Метод 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. 
    } 
} 
+0

Как вызывается присоединение к 'Thread', созданное в' clear() '_before_' save() '? – Gray

ответ

1

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

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

1

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

+0

Я пропустил что-то по моему вопросу. Он обновляется сейчас –

1

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

synchronized(this) { 
    clear(); 
    save(); 
} 
Смежные вопросы