Java/Android:同步与队列实现
我可以问一个新手Java问题吗
我正在从网上下载一些文件。此方法下载(url位置)被多次调用
public static void download(final String url) {
Thread t = new Thread("download") {
@Override
public void run() {
try {
synchronized (object) {
// download & save
}
} catch(Exception e) {}
}
};
t.start();
}
我添加了“synchronized”,以便一个接一个地进行下载。(不是同时进行多次下载)
我猜即使多次调用download(),synchronized也会阻止其他线程,直到第一个线程完成
上面的代码行吗?还是我必须实现队列?然后一个接一个地排队
同步能否阻止“足够”的线程?(30? 50?) 还是有限制
# 1 楼答案
以下是如何做到这一点:
这将在单个后台线程上对所有可运行程序(即下载)进行排队
# 2 楼答案
是的,只要
object
在所有线程中引用相同的对象,同步块中的代码一次只能由一个线程执行一般来说,我建议您尽可能使用高级构造(例如来自java.util.concurrent包)。例如,您可以考虑使用执行器服务来执行这些类型的操作。
不,没有限制。至少不接近30或50:-)
# 3 楼答案
如果可以避免创建额外的线程,通常应该这样做。据我所知,您永远不希望两个工作项(下载)并行,因此最好的方法是使用由单个工作线程轮询的并发队列实现