Понимание синхронизации и реализации очереди - PullRequest
3 голосов
/ 19 декабря 2011

Я делаю несколько веб-запросов из приложения Android, над которым я работаю.Я хочу, чтобы все эти запросы обрабатывались по одному в том порядке, в котором они поступают. Мой код ниже делает это?

Способ, которым я читаю и понимаю синхронизированный, состоит в том, что из всех потоков, которые я раскручиваю, только один может быть одним из перечисленных ниже способов одновременно.Например, если пользователь пытается опубликовать PostPhoto в одном потоке, а затем сразу же получить getData в другом потоке, поток getData должен будет дождаться завершения потока postPhoto, прежде чем он начнет получать данные.Поскольку все мои веб-запросы проходят через этот класс, и все методы синхронизируются, это означает, что они по существу поставлены в очередь правильно?

public class Controller {

public synchronized static String getData(String url, String limit) { ... }

public synchronized static String postPhoto(String filepath, int server_id) { ... }

public synchronized static InputStream getPhoto(String thumbnailPath) { ... }

public synchronized static String createIncident(String name, String description) { ... }

public synchronized static String updatePerson() { ... }

synchronized static boolean verifyConnection(String response) { ... }
}

РЕДАКТИРОВАТЬ:
Я, вероятно, должен был иметьупомянул, что, хотя некоторые из вышеупомянутых методов называются createIncident или updatePerson, все они ТОЛЬКО выполняют httprequests, код внутри всех методов, как правило, одинаков за исключением важных незначительных изменений.В других частях моего кода я раскручиваю потоки для вызова этих методов, и это та часть, о которой я спрашивал.Поскольку эти потоки вызывают эти методы, поток B, который вызывает getData, должен будет ждать, пока поток A не завершит свою часть postPhoto.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Это также зависит от вашей реализации. Ваш контроллер синглтон или экземпляр на поток? ваши методы используют общие объекты?

Если синглтон и методы совместно используют объекты, то нет никакой гарантии, что thread1 запустит postPhoto, а затем сразу после этого getData, даже если вы вызываете последовательно. Другой поток может взять ход и начать работать между потоками 1, вызывая эти 2 метода.

Помните, что синхронизированное ключевое слово блокирует сам класс, поэтому в любой момент будет выполняться только один метод. Не будет одновременно запущено 2 синхронизированных метода.

1 голос
/ 19 декабря 2011

Да, вы правы.Комбинация synchronized и static гарантирует то, что вы хотите.

...