当前位置: 首页 > 知识库问答 >
问题:

Java/Android:同步与队列实现

夏侯昆琦
2023-03-14

我可以问一个新手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();
}

我添加了“同步”,这样下载就会一个接一个地发生。(不是同时发生多个下载)。
我猜即使下载()被多次调用,同步也会阻塞其他线程,直到第一个线程完成。

上面的代码会起作用吗?还是我必须实现队列?并逐个取消排队?
同步可以阻止“足够”的线程吗?(30? 50?)还是有限制?

共有3个答案

晏修诚
2023-03-14

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

唐恺
2023-03-14

上面的代码会起作用吗?

是的,只要< code>object在所有线程中引用同一个对象,synchronized块中的代码一次只会被一个线程执行。

[…]还是我必须实现队列?然后一个接一个地排队?

一般来说,我会建议您尽可能使用高级结构(例如来自java.util.concurrent包)。例如,您可以考虑为这些类型的事情使用executor服务。

[…]同步可以阻止“足够”的线程吗?(30?50?)还是有限制?

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

穆招
2023-03-14

操作方法如下:

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

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

 类似资料:
  • 我有两个线程用于在线游戏制作。一个线程接收两个 X 和 Y 数字,另一个线程将 X 和 Y 数字发送给登录到服务器的每个人。基本上,我需要一个队列,这将允许第一个线程将2D数组添加到队列中,并继续这样做,同时,将数组拉出并从队列中删除数组以用于发送给其他玩家。有没有办法做到这一点?我知道我需要一个同步的队列,但是我如何同步一个,这被称为阻塞队列吗? 总的来说,我需要一个同步的队列,这将允许两个线程

  • 我一直在做一个需要同步队列的项目,因为我的程序是多线程的,线程可能会访问这个队列。我使用arraylist来实现这一点,但我似乎遇到了一些问题,线程陷入僵局。我不知道排队是否是原因,但我只是想检查一下: 编辑:即使使用LinkedBlockingQueue,我也会陷入与之前相同的循环中。我认为这是因为有一个线程正在等待队列被填充,但它从来没有这样做,因为其他功能已经完成运行…有什么想法吗???

  • 问题内容: Linux中有等待队列为FIFO的锁吗?这似乎是一件显而易见的事情,但是我刚刚发现pthread互斥锁不是FIFO,信号量显然也不是FIFO(我正在研究内核2.4(家庭作业))… Linux是否具有带有FIFO等待队列的锁,或者是否有简单的方法可以利用现有机制来建立锁? 问题答案: 这是创建基于pthreads原语的简单排队“票证锁”的方法。它应该给您一些想法:

  • 我正在尝试使用Servlets(resteasy+Hibernate)实现一个约会队列。我的约会控制器如下(当然是简化的)。 目前这种方法工作良好。但我读过关于BlockingQueue实现的文章,哪种方法似乎是正确的? 工作细节的定义: 如果不使用同步静态并同时发送多个请求,则多个约会具有相同的约会编号 但如果使用同步静态,则以正确顺序创建的约会 我需要澄清的是; -这是正确的方法吗? -在我的

  • 我试图在artemis上做几个样本,下面的问题的任何帮助都是伟大的更好的系统设计。 > 如果我们选择通过CLI/Web控制台选项创建队列,那么存储在绑定日志中的队列信息是否会因为我看不到代理xml得到更新?如果是这样的话,broker实例在引导时加载broker.xml中存在的所有地址以及通过CLI创建的地址?如有理解,请更正。我希望有自动创建队列的方式,并寻找最佳选择,而无需重新启动服务器。 我

  • 主要内容:1 ConcurrentLinkedQueue的概述,2 ConcurrentLinkedQueue的实现,2.1 基本结构,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 过程详解,2.6 获取操作,2.7 其他操作,3 ConcurrentLinkedQueue的总结基于JDK1.8详细介绍了ConcurrentLinkedQueue的底层源码实现,包括同步原理、入队操作、出队操作、获取操作等。 1 ConcurrentLinkedQueue的概述 public cla