有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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?) 还是有限制


共 (3) 个答案

  1. # 1 楼答案

    以下是如何做到这一点:

    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
                }
            });
        }
    }
    

    这将在单个后台线程上对所有可运行程序(即下载)进行排队

  2. # 2 楼答案

    Will above code work?

    是的,只要object在所有线程中引用相同的对象,同步块中的代码一次只能由一个线程执行

    [...] or do I have to implement Queue? and dequeue one-by-one?

    一般来说,我建议您尽可能使用高级构造(例如来自java.util.concurrent包)。例如,您可以考虑使用执行器服务来执行这些类型的操作。

    [...] Can synchronized block "enough" threads? (30? 50?) or does it have limits?

    不,没有限制。至少不接近30或50:-)

  3. # 3 楼答案

    如果可以避免创建额外的线程,通常应该这样做。据我所知,您永远不希望两个工作项(下载)并行,因此最好的方法是使用由单个工作线程轮询的并发队列实现