我从我正在处理的 Android 应用程序发出多个网络请求。我希望所有这些请求按照它们到达的顺序一次处理一个,我的下面的代码可以做到吗?
我阅读和理解 synchronized 的方式是,在我分离出的所有线程中,一次只能有一个线程处于以下任何一种方法中。例如,如果用户尝试在一个线程中发布照片,然后立即在另一个线程中获取数据,则获取数据线程必须等到发布照片线程完成后才能开始获取数据。由于我所有的 Web 请求都通过此类并且所有方法都是同步的,这意味着它们基本上已经排队了,对吗?
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 的一部分。
最佳答案
这也取决于您的实现。 您的 Controller 是单例还是每个线程的实例? 你的方法使用共享对象吗?
如果单例和方法共享对象,则不能保证线程 1 运行 postPhoto,然后在该 getData 之后立即运行,即使您按顺序调用也是如此。另一个线程可能轮到并开始在调用这 2 个方法的线程 1 之间运行。
请记住,synchronized 关键字锁定类本身,因此在任何时候都只会执行一个方法。不会同时运行 2 个同步方法。
关于java - 理解同步和实现队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562323/