2011-12-19 11 views
3

Я делаю несколько веб-запросов из приложения 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) { ... } 
} 

EDIT:
я, вероятно, следовало бы отметить, что, хотя некоторые из перечисленных выше методов называют createIncident или updatePerson, все они только делают httprequests, код внутри все методы, как правило, то же самое за исключением важных незначительных вариаций. В других частях моего кода я выделяю потоки, чтобы называть эти методы, и это та часть, о которой я просил. Поскольку эти потоки называют эти методы, поток B, вызывающий getData, должен будет ждать, пока поток A не завершит его часть postPhoto.

+1

Идея, стоящая перед большинством очередей, заключается в том, чтобы позволить производителю и потребителю работать одновременно. В этом случае вы будете сериализовать свои запросы, но ваши «производители» заблокируют, когда «потребитель» занят. –

+0

Просто, чтобы уточнить, что сказал @Peter: ваш код в основном не многопоточен, как есть, что, вероятно, не то, что вы хотите. Это, безусловно, безопасно синхронизировано, но настолько, что вы можете иметь только производительность, соответствующую одному ядру на многоядерном оборудовании. – toto2

+0

Я собираюсь уточнить. Я думаю, что я оставил важную информацию из оригинального вопроса. – Josh

ответ

1

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

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

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

+0

Все методы являются статическими, поэтому не имеет значения, является ли он одиночным. – toto2

+0

Да, часть, которую мы видим, статична, но могут быть и некоторые методы экземпляра, мы не видим весь код. – fmucar

+0

Да, это не синглтон, и все методы статичны. Думаю, последняя часть вашего ответа - то, что мне нужно. Поскольку они являются статическими и синхронизированными блокировками класса, в любой момент будет выполняться только один метод. Я знаю, что порядок не будет соблюден, но я в порядке с этим. Пока это один за раз – Josh

1

Да, вы правы. Сочетание synchronized и static гарантирует то, что вы хотите.

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