Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 等待某事发生的队列_Java_Multithreading_Concurrency - Fatal编程技术网

Java 等待某事发生的队列

Java 等待某事发生的队列,java,multithreading,concurrency,Java,Multithreading,Concurrency,我想实现队列,它等待共享资源。当此资源空闲时,队列获取第一个添加的元素并更改此资源中的信息。但如果没有,就等着吧。并发库中是否有可以执行此操作的队列?或者我需要写我自己的队列?还是有更好的方法? 谢谢你的帮助)听起来你想要两样东西 要在资源上执行的任务队列的BlockingQueue实例(例如ArrayBlockingQueue) 资源的锁,供线程等待,直到资源可用 然后,线程可以从队列中取出一个项目并等待资源锁,或者等待资源锁,然后在持有该锁的同时尝试从队列中取出一个项目 等待并首先从队列中取

我想实现队列,它等待共享资源。当此资源空闲时,队列获取第一个添加的元素并更改此资源中的信息。但如果没有,就等着吧。并发库中是否有可以执行此操作的队列?或者我需要写我自己的队列?还是有更好的方法?
谢谢你的帮助)

听起来你想要两样东西

  • 要在资源上执行的任务队列的
    BlockingQueue
    实例(例如
    ArrayBlockingQueue

  • 资源的锁,供线程等待,直到资源可用

  • 然后,线程可以从队列中取出一个项目并等待资源锁,或者等待资源锁,然后在持有该锁的同时尝试从队列中取出一个项目

    等待并首先从队列中取出是一种更简单的设计,但您在问题中的措辞似乎使您希望做相反的事情,先等待资源锁,然后尝试从队列中取出。该工作流稍微复杂一点,因为您应该从队列中
    poll()
    (而不是
    take()
    )并在队列为空时释放资源锁(如果您不想保留它)

    例如

  • 等待资源锁定
  • 。。。获取资源锁
  • 从队列轮询
  • 若队列为空,则释放资源锁
  • 如果队列不是空的,则处理队列项
  • 释放资源锁
  • 若队列是空的,那个么睡一会儿
  • 重复一遍

  • 是你的朋友。A可能是
    封锁队列
    的有用替代品,这取决于生产者和消费者的实际行动。封锁队列提供了解决第2点的方法。@Luigimendoza我知道
    take
    方法,特别是因为它是拥有
    封锁队列
    的主要原因,但问题的措辞似乎表明,还有另一个资源(与队列分开)需要等待(例如,网络连接或其他类似的资源)。我可能错了,这个问题的措辞不是特别好,但这是我的假设,也是我的答案的基础。例如,需要发送到网络连接的项目队列,其他线程也可能正在使用这些项目。哦,对不起。。你说得对,我需要更具体地描述一下情况。有不同的应用程序和一个共享资源。每个应用程序都可以更改资源中的信息。我的任务是:我需要实现另一个应用程序,它读取和写入(更改)资源。所有信息都在运行时更改,我需要将其存储在队列中。当资源空闲时,我的应用程序从队列中获取信息并更改资源中的信息。