Java/Android:同步与队列实现
我可以问一个新手Java问题吗 我正在从网上下载一些文件。此方法下载(url位置)被多次调用Java/Android:同步与队列实现,java,android,synchronization,queue,synchronized,Java,Android,Synchronization,Queue,Synchronized,我可以问一个新手Java问题吗 我正在从网上下载一些文件。此方法下载(url位置)被多次调用 public static void download(final String url) { Thread t = new Thread("download") { @Override public void run() { try { synchronized (object) {
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?)还是有限制 上述代码有效吗? 是的,只要
object
在所有线程中引用相同的对象,同步块中的代码一次只能由一个线程执行
[…]还是我必须实现队列?然后一个接一个地排队?
一般来说,我建议您尽可能使用高级构造(例如来自java.util.concurrent包)。例如,您可以考虑使用执行器服务来执行这些类型的操作。
[…]同步能否阻止“足够”的线程?(30?50?)还是有限制?
不,没有限制。至少不要接近30或50:-)如果可以避免创建额外的线程,通常应该这样做。据我所知,您永远不希望两个工作项(下载)同时进行,因此,从性能角度来看,最好的办法是使用由单个工作线程轮询的并发队列实现。以下是如何做到这一点:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class QueueDownloader {
private final ExecutorService executor = Executors.newSingleThreadExecutor();
public void download(final String url) {
executor.execute(new Runnable() {
@Override
public void run() {
// download & save
}
});
}
}
这将在单个后台线程上对所有可运行程序(即下载)进行排队