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

使用ArrayList在Java中实现同步队列

吴兴国
2023-03-14

我一直在做一个需要同步队列的项目,因为我的程序是多线程的,线程可能会访问这个队列。我使用arraylist来实现这一点,但我似乎遇到了一些问题,线程陷入僵局。我不知道排队是否是原因,但我只是想检查一下:

public class URLQueue {
    private ArrayList<URL> urls;

    public URLQueue() {
        urls = new ArrayList<URL>();
    }

    public synchronized URL remove() throws InterruptedException {
        while (urls.isEmpty())
            wait();
        URL r = urls.remove(0);
        notifyAll();
        return r;
    }

    public synchronized void add(URL newURL) throws InterruptedException {
        urls.add(newURL);
        notifyAll();
    }

    public int getSize() {
        return urls.size();
    }
}

编辑:即使使用LinkedBlockingQueue,我也会陷入与之前相同的循环中。我认为这是因为有一个线程正在等待队列被填充,但它从来没有这样做,因为其他功能已经完成运行…有什么想法吗???

共有2个答案

钮巴英
2023-03-14

在您的代码中,notifyAll() 不会引发中断异常,因此您应该从 add() 中删除抛出

remove() 方法不需要通知All(),因为它的操作不应该唤醒其他线程

应该同步< code>getSize()方法。

否则,代码不可能死锁,因为需要两个锁来创建死锁。

洪逸清
2023-03-14

最好在这里使用链接块队列,因为它是为此目的而设计的。它会等到某个元素可用,同时尝试删除一个 alement。

链接阻止队列

它提供了一个< code>take()方法

检索并删除此队列的头,如有必要,请等待元素变为可用

 类似资料:
  • 我可以问一个新手Java问题吗? 我正在从网上下载一些文件。此方法下载(url位置)被多次调用。 我添加了“同步”,这样下载就会一个接一个地发生。(不是同时发生多个下载)。 我猜即使下载()被多次调用,同步也会阻塞其他线程,直到第一个线程完成。 上面的代码会起作用吗?还是我必须实现队列?并逐个取消排队? 同步可以阻止“足够”的线程吗?(30? 50?)还是有限制?

  • 本文向大家介绍如何在Java 9中使用JShell实现ArrayList?,包括了如何在Java 9中使用JShell实现ArrayList?的使用技巧和注意事项,需要的朋友参考一下 JShell 是一个交互式Java Shell工具,使我们能够从Shell中执行Java代码并立即显示输出。JShell是从命令行运行的REPL(读取评估打印循环)工具。我们可以通过简单地在命令提示符下键入“ jsh

  • 本文向大家介绍在Ubuntu中使用NTP实现时间同步,包括了在Ubuntu中使用NTP实现时间同步的使用技巧和注意事项,需要的朋友参考一下 NTP 是通过网络来同步时间的一种 TCP/IP 协议。通常客户端向服务器请求当前的时间,并根据结果来设置其时钟。 这个描述是挺简单的,实现这一功能却是极为复杂的 - 首先要有多层 NTP 服务器,第一层 NTP 服务器连接原子时钟,第二层、第三层服务器则担起

  • 问题内容: 我不确定这是否是同步我的的正确方法。 我有一个 从函数传递过来的。 现在,我正在尝试使其同步。这是否正确同步了我的对象? 问题答案: 您要进行两次同步,这是没有意义的,可能会减慢代码的速度:在列表上进行迭代时所做的更改需要整个操作的同步,在这种情况下,使用Using 这样做是多余的(它创建了一个包装程序来同步各个操作)。 但是,由于您要完全清空列表,因此迭代删除第一个元素是最糟糕的方法

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

  • 问题内容: 我希望这将是足够的信息,所以就在这里。如果您需要更多信息,请在评论中了解。 我有一班有两个内部班。内部类每个都有两个方法来调用外部类中的方法。因此,它看起来像这样: 重要的是要注意: 这是针对Android应用的。的实例,并传递给作为网页视图一个JavaScript接口,所以并可以随时调用,没有特定的顺序。 目前,我在使用现有代码(不使用synced关键字)时遇到了一个问题,该问题在同