【发布时间】:2012-01-23 15:24:15
【问题描述】:
我从正在开发的 Android 应用程序发出多个 Web 请求。我希望按照它们到达的顺序一次处理所有这些请求,我的下面的代码可以做到吗?
我阅读和理解同步的方式是在我衍生的所有线程中,一次只能有一个可以在以下任何一种方法中。例如,如果用户尝试在一个线程中发布照片,然后立即在另一个线程中获取数据,那么 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,所有方法中的代码通常都是相同的,除了重要的微小变化。在我的代码的其他部分,我分拆线程来调用这些方法,这就是我要询问的部分。由于这些线程调用这些方法,调用 getData 的线程 B 将不得不等到线程 A 完成它是 postPhoto 的一部分。
【问题讨论】:
-
大多数队列背后的想法是允许生产者和消费者同时工作。在这种情况下,您将序列化您的请求,但是当“消费者”忙碌时,您的“生产者”将阻塞。
-
只是为了澄清@Peter 所说的:您的代码基本上不是多线程的,这可能不是您想要的。它当然是安全同步的,但如此之多,以至于您只能在多核硬件上获得与单核相对应的性能。
-
我要澄清一下。我想我在原始问题中遗漏了一些重要信息
-
阅读您的编辑后,您的过度同步似乎比我想象的还要严重。当一个方法发出一个 httprequest 时,它会持有 Controller.class 的锁,因此在您等待回复时没有其他方法可以运行......这可能会很长时间。
标签: java oop synchronization queue synchronized