Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/Android:同步与队列实现_Java_Android_Synchronization_Queue_Synchronized - Fatal编程技术网

Java/Android:同步与队列实现

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) {

我可以问一个新手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?)还是有限制

上述代码有效吗?

是的,只要
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
            }
        });
    }
}
这将在单个后台线程上对所有可运行程序(即下载)进行排队